当前位置: 首页 > 知识库问答 >
问题:

为什么用Mockito进行JUnit测试时没有定义“when”方法?

山鸿彩
2023-03-14

我正在尝试测试一个空数据库/没有从数据库返回任何内容的场景。

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

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

我附上了MyDao和MyService的样例代码供参考。(我简化了它们,MyDao有四个方法来检索四种对象)

public class MyDaoImpl implements MyDao {
    @SuppressWarnings("unused")
    private DataSource dataSource;
    private JdbcTemplate jdbcTemplate;
    private String schema;

    @ConstructorProperties({ "dataSource", "schema" })
    private MyDaoImpl(DataSource dataSource, String schema) {
        this.dataSource = dataSource;
        this.schema = schema;
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    @Override
    public List<SomeObjectTypeA> listSomeObjectTypeA() {
        return this.jdbcTemplate.query("select * from " + schema + ".SOME_TABLE", new RowMapper<SomeObjectTypeA>() {
            @Override
            public SoftBillAccount mapRow(ResultSet rs, int rowNum) throws SQLException {
                String memberA = rs.getString("MEMBER_A");
                String memberB = rs.getString("MEMBER_B");
            }
        });

    }
    public List<SomeObjectTypeA> listSomeObjectTypeB() {
        //omitted
    }
    public List<SomeObjectTypeA> listSomeObjectTypeC() {
        //omitted
    }
    public List<SomeObjectTypeA> listSomeObjectTypeD() {
        //omitted
    }
}

public class MyServiceImpl implements MyService {

    private MyDao myDao;

    public MyServiceImpl(){}

    @ConstructorProperties({ "myDao" })
    public MyServiceImpl(MyDao myDao) {
        this.myDao = myDao;
    }

    @Override
    public List<String> getSomeObjectTypeA_MemberA_Only() {
        List<SomeObjectTypeA> list = myDao.listSomeObjectTypeA();
        List<String> memberAList = new ArrayList<String>();
        for (SomeObjectTypeA objectA : list) {
            memberAList.add(objectA.getMemberA());
        }
        return memberAList;
    }
}



public class MyServiceImpl implements MyService {

    private MyDao myDao;

    public MyServiceImpl(){}

    @ConstructorProperties({ "myDao" })
    public MyServiceImpl(MyDao myDao) {
        this.myDao = myDao;
    }

    @Override
    public List<String> getSomeObjectTypeA_MemberA_Only() {
        List<SomeObjectTypeA> list = mydao.listSomeObjectTypeA();
        List<String> memberAList = new ArrayList<String>();
        for (SomeObjectTypeA objectA : list) {
            memberAList.add(objectA.getMemberA());
        }
        return memberAList;
    }
}

这是测试类:

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());
    }

共有2个答案

武睿
2023-03-14

如果我的刀会怎么样。未配置时调用someMethod()?

使用纯mockito(因此没有调用read方法的间谍用法),它不会抛出任何异常或错误,它只会将方法实现为一个空体。然后,如果方法声明为void,则不需要其他行为,如果方法是用返回类型声明的,则它会返回声明类型结果的默认值,对于对象(但对于Mockito返回其空实例的集合),该值为空引用,最后是基元的默认值。

但是请注意,一般来说,Mockito的这个特性不会在您的测试逻辑中产生任何副作用,因为通常您想要断言列表的内容,而不仅仅是它们的非空性。
但是在您的情况下,您模拟空列表:

when(myDao.listSomeObjectTypeB()).thenReturn( Collections.<SomeObjectTypeB>emptyList() );
姜博
2023-03-14

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

 类似资料:
  • 我正在尝试测试一个带有空数据库/没有从数据库返回任何内容的场景。 我用mockito编写了一个junit4测试类。有一个由Mockito创建的服务类和dao类。一开始,我定义了“when”方法,它起作用了。后来,我试着拉出“when”方法调用,看看会发生什么,反正它起作用了。为什么? 当调用myService.getDistinctObjectList()时,myService类将调用myDao的

  • 我有这个过滤器类,在使用junit进行测试时需要尽可能高的代码覆盖率。 和测试等级: 当我运行时,它在 线 我如何避免这种情况? 我需要调用这个方法并执行里面的任何内容来提供所需的代码覆盖。

  • 问题内容: 也许我的问题是新手,但是我真的无法理解在什么情况下使用junit? 无论是编写简单的应用程序还是大型应用程序,我都使用语句对其进行测试,这对我来说很容易。 如果仍然需要调用相同的方法,检查它们返回的内容,然后又要为所有内容添加注释,那么为什么要使用JUnit创建测试类,在项目中创建不必要的文件夹呢? 为什么不编写一个类并立即对其进行测试而不创建Test-class? PS。我从未在刚刚

  • 看起来HttpClient及其子类有问题。

  • 当我尝试运行一个JUnit类时,我得到以下错误: 我怀疑这是POM.xml中的配置问题,但我不确定。顺便说一下,这里是依赖项: http://maven.apache.org/maven-v4_0_0.xsd"

  • 有一个使用SpringMVC4.0.3.Release的代码库,用于Restful Web服务。 ServletInitializer: 用户控制器: 用户道: 当我在本地调用构建时: 生成到stdout的输出: 正在运行com.myapp.rest.controllers.UserControllerTest 我到底做错了什么? 显然,我需要模拟出响应,但我在谷歌上搜索了这个结果,其他使用Moc