模拟考试的正确方法



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

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

相关内容

  • 没有找到相关文章

最新更新