Java 为什么使用Mockito进行JUnit测试时不定义;什么时候;方法?

Java 为什么使用Mockito进行JUnit测试时不定义;什么时候;方法?,java,junit,mockito,Java,Junit,Mockito,我正在尝试测试一个数据库为空/数据库未返回任何内容的场景 我用mockito编写了一个junit4测试类。mockito创建了一个服务类和dao类。首先,我定义了“when”方法,它起作用了。后来,我尝试拉“when”方法调用,看看会发生什么,不管怎样,它还是起作用了。为什么? 调用myService.getDistinctObjectList()时,类myService将调用myDao的所有四个方法。所以我认为我必须模拟所有四个方法并返回虚拟结果。如果在未配置myDao.someMethod(

我正在尝试测试一个数据库为空/数据库未返回任何内容的场景

我用mockito编写了一个junit4测试类。mockito创建了一个服务类和dao类。首先,我定义了“when”方法,它起作用了。后来,我尝试拉“when”方法调用,看看会发生什么,不管怎样,它还是起作用了。为什么?

调用myService.getDistinctObjectList()时,类myService将调用myDao的所有四个方法。所以我认为我必须模拟所有四个方法并返回虚拟结果。如果在未配置myDao.someMethod()时调用它,会发生什么情况?MyDao应该与数据库一起工作,但我没有给它任何东西

我附上MyDao和MyService的示例代码以供参考。(我对它们进行了简化,MyDao有四种方法可以检索四种对象)

公共类MyDaoImpl实现MyDao{
@抑制警告(“未使用”)
私有数据源;
私有JdbcTemplate JdbcTemplate;
私有字符串模式;
@构造函数属性({“数据源”、“架构”})
私有MyDaoImpl(数据源、数据源、字符串模式){
this.dataSource=数据源;
this.schema=schema;
this.jdbcTemplate=新的jdbcTemplate(数据源);
}
@凌驾
公共列表listSomeObjectTypeA(){
返回此.jdbcTemplate.query(“从“+schema+”.SOME_表中选择*”,新建行映射器(){
@凌驾
public SoftBillAccount mapRow(结果集rs,int rowNum)引发SQLException{
String memberA=rs.getString(“MEMBER_A”);
String memberB=rs.getString(“MEMBER_B”);
}
});
}
公共列表listSomeObjectTypeB(){
//省略
}
公共列表listSomeObjectTypeC(){
//省略
}
公共列表listSomeObjectTypeD(){
//省略
}
}
公共类MyServiceImpl实现了MyService{
私人密道密道;
公共MyServiceImpl(){}
@构造函数属性({“myDao”})
公共MyServiceImpl(MyDao MyDao){
this.myDao=myDao;
}
@凌驾
公共列表getSomeObjectTypeA\u成员A\u仅限(){
List=myDao.listSomeObjectTypeA();
List memberAList=new ArrayList();
对于(SomeObjectTypeA对象A:列表){
add(objectA.getMemberA());
}
返回成员;
}
}
公共类MyServiceImpl实现了MyService{
私人密道密道;
公共MyServiceImpl(){}
@构造函数属性({“myDao”})
公共MyServiceImpl(MyDao MyDao){
this.myDao=myDao;
}
@凌驾
公共列表getSomeObjectTypeA\u成员A\u仅限(){
List=mydao.listSomeObjectTypeA();
List memberAList=new ArrayList();
对于(SomeObjectTypeA对象A:列表){
add(objectA.getMemberA());
}
返回成员;
}
}
这是测试类:

public class Test1{

    @InjectMocks
    private MyServiceImpl myService;

    @Mock
    private MyDao myDao;

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testEmptyDatabase() {

        //ArrayList<SomeObjectTypeA> list = new ArrayList<SomeObjectTypeA>();
        //list.add( new SomeObjectTypeA("A","A", "A", "A") );
        //when(myDao.listSomeObjectTypeA()).thenReturn( Collections.<SomeObjectTypeA>emptyList() );
        //when(myDao.listSomeObjectTypeB()).thenReturn( Collections.<SomeObjectTypeB>emptyList() );
        //when(myDao.listSomeObjectTypeC()).thenReturn( Collections.<SomeObjectTypeC>emptyList() );
        //when(myDao.listSomeObjectTypeD()).thenReturn( Collections.<SomeObjectTypeD>emptyList() );

        List<String> distinctList = myService.getDistinctObjectList(); // myService.getDistinctObjectList() end up calling all four methods of myDao

        //Write the List to a file, with a trailer with record count
        OutputWriter outputWriter = new OutputWriterImpl(outputFileDir, outputFilePrefix,outputFileSuffix);
        try{
            outputWriter.writeOutput(distinctList);
        }catch(IOException e){
            e.printStackTrace();
        }

        //Create a control file for comparison
        try{
            BufferedWriter bfr = new BufferedWriter(new FileWriter(compareFileDir+compareFilePrefix+compareFileSuffix));
            bfr.write("Trailer|");
            bfr.write(String.format("%07d", 0));
            bfr.newLine();
            bfr.close();
        }catch(IOException e){
            e.printStackTrace();
        }
        File file1 = new File(outputFileDir + outputFilePrefix + date + outputFileSuffix);
        File file2 = new File(compareFileDir+ compareFilePrefix+compareFileSuffix);

        System.out.println(file1.length()); // show 17
        System.out.println(file2.length()); // show 17

        assertEquals(file1.length(), file2.length());
    }
公共类Test1{
@注射模拟
私有myservicempl myService;
@嘲弄
私人密道密道;
@以前
公共void init(){
initMocks(this);
}
@试验
public void testEmptyDatabase(){
//ArrayList=新建ArrayList();
//添加(新的SomeObjectTypeA(“A”、“A”、“A”、“A”));
//when(myDao.listSomeObjectTypeA()).thenReturn(Collections.emptyList());
//when(myDao.listSomeObjectTypeB()).thenReturn(Collections.emptyList());
//when(myDao.listSomeObjectTypeC()).thenReturn(Collections.emptyList());
//when(myDao.listSomeObjectTypeD()).thenReturn(Collections.emptyList());
List distinctList=myService.getDistinctObjectList();//myService.getDistinctObjectList()最终调用myDao的所有四个方法
//将列表写入一个文件,其中包含一个带有记录计数的尾部
OutputWriter OutputWriter=新的OutputWriterImpl(outputFileDir、outputFilePrefix、outputFileSuffix);
试一试{
outputWriter.writeOutput(distinctList);
}捕获(IOE异常){
e、 printStackTrace();
}
//创建用于比较的控制文件
试一试{
BufferedWriter bfr=新的BufferedWriter(新文件写入程序(compareFileDir+CompareFileRefix+CompareFileRefix));
bfr.写(“预告片|”);
写入(字符串格式(“%07d”,0));
bfr.newLine();
bfr.close();
}捕获(IOE异常){
e、 printStackTrace();
}
File file1=新文件(outputFileDir+outputFilePrefix+date+outputFileSuffix);
File file2=新文件(compareFileDir+compareFileRefix+compareFileSuffix);
System.out.println(file1.length());//show 17
System.out.println(file2.length());//show 17
assertEquals(file1.length(),file2.length());
}

除非您显式更改模拟的默认行为,否则它将返回。对于集合,默认返回值是空集合,因此当调用时,您不需要显式使用
来返回注释掉的代码所返回的空集合。

除非您显式更改模拟的默认行为,否则它将返回return.对于collection,默认返回值是空集合,因此当
调用返回空集合时,不需要像注释掉的代码那样显式使用

如果myDao.someMethod()未被调用,会发生什么 配置

使用普通mockito(因此没有调用read方法的间谍用法),它不会抛出任何异常或错误,它将简单地将该方法实现为空体。然后,如果该方法声明为
void
,则不需要其他行为,如果该方法声明为返回类型,则它将返回声明的类型结果的默认值,即对象的
null
引用,但对于模拟的集合
public class Test1{

    @InjectMocks
    private MyServiceImpl myService;

    @Mock
    private MyDao myDao;

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testEmptyDatabase() {

        //ArrayList<SomeObjectTypeA> list = new ArrayList<SomeObjectTypeA>();
        //list.add( new SomeObjectTypeA("A","A", "A", "A") );
        //when(myDao.listSomeObjectTypeA()).thenReturn( Collections.<SomeObjectTypeA>emptyList() );
        //when(myDao.listSomeObjectTypeB()).thenReturn( Collections.<SomeObjectTypeB>emptyList() );
        //when(myDao.listSomeObjectTypeC()).thenReturn( Collections.<SomeObjectTypeC>emptyList() );
        //when(myDao.listSomeObjectTypeD()).thenReturn( Collections.<SomeObjectTypeD>emptyList() );

        List<String> distinctList = myService.getDistinctObjectList(); // myService.getDistinctObjectList() end up calling all four methods of myDao

        //Write the List to a file, with a trailer with record count
        OutputWriter outputWriter = new OutputWriterImpl(outputFileDir, outputFilePrefix,outputFileSuffix);
        try{
            outputWriter.writeOutput(distinctList);
        }catch(IOException e){
            e.printStackTrace();
        }

        //Create a control file for comparison
        try{
            BufferedWriter bfr = new BufferedWriter(new FileWriter(compareFileDir+compareFilePrefix+compareFileSuffix));
            bfr.write("Trailer|");
            bfr.write(String.format("%07d", 0));
            bfr.newLine();
            bfr.close();
        }catch(IOException e){
            e.printStackTrace();
        }
        File file1 = new File(outputFileDir + outputFilePrefix + date + outputFileSuffix);
        File file2 = new File(compareFileDir+ compareFilePrefix+compareFileSuffix);

        System.out.println(file1.length()); // show 17
        System.out.println(file2.length()); // show 17

        assertEquals(file1.length(), file2.length());
    }
when(myDao.listSomeObjectTypeB()).thenReturn( Collections.<SomeObjectTypeB>emptyList() );