Java 进行模拟测试的正确方法

Java 进行模拟测试的正确方法,java,unit-testing,mockito,powermock,Java,Unit Testing,Mockito,Powermock,在我的代码库中,我有这样一个函数 ABCDAO abcDao; public A(ABCDAO abcDao) { this.abcDao = abcDao; } public ABC listABCElement(String arg, boolean withError) { return abcDao.getABC(arg, withError); } 由于DAO连接到一个web服务(有很多配置,很难设置,而且肯定需要一些时间来测试,因为它将连接到真正的服务器…)并收回结

在我的代码库中,我有这样一个函数

ABCDAO abcDao; 

public A(ABCDAO abcDao) {
   this.abcDao = abcDao;
}

public ABC listABCElement(String arg, boolean withError) {
  return abcDao.getABC(arg, withError);
}
由于DAO连接到一个web服务(有很多配置,很难设置,而且肯定需要一些时间来测试,因为它将连接到真正的服务器…)并收回结果,因此我决定使用模拟测试(
PowerMockito
+
Mockito
)来测试listABCElement函数。但是,假设在进行模拟测试时,我将使用

ABCDDAO abcDao = Mockito.mock(ABCDAO.class);
Mockito.when(abcDao.getABC("", true)).thenReturn(new ABC());
......
assertNotNull(obj.listABCElement("", true));
我觉得这没有任何意义,因为我强制函数的结果返回一些东西,然后测试它是否返回任何东西(!?!)


在这种情况下,进行单元测试的正确方法是什么

你的想法是正确的——这样的测试毫无意义。实际上,您正在测试Mockito是否如广告所示工作

在这种情况下,您可能需要做的是流测试。您的类
A
本身并没有任何逻辑,它只是委托给
ABCDAO
——所以这正是您想要测试的。实现这一点的方法是模拟
ABCDAO
(尽管定义此调用的行为是多余的),但不是断言值(正如您所指出的,这是毫无意义的),而是使用
Mockito
验证是否调用了正确的方法:

@Test
public void testListABC() {
    // Mock the ABCDAO
    ABCDAO abcDao = Mockito.mock(ABCDAO.class);

    // Create an A instance using it
    A a = new A(abcDao);

    // Call a's method
    a.listABCElement("",true);

    // Verify the correct method of abcDao was called 
    Mockito.verify(abcDao).getABC("", true);

    // Verify no other methods were called on abcDao
    Mockito.verifyNoMoreInteractions(abcDao);
}