[英]Mockito test - reason of failing my testcase
昨天学习了JUnit,今天学习了Mockito
我写了一个简单的课;
public class FileOperations {
public boolean autoMove(){
List<byte[]> patterns = getListofPatterns();
for(byte[] pattern: patterns){
System.out.println(new String(pattern));
if(seekInHeader(pattern)){
//logic to move file of specific folder of specific extension
return true;
}
}
return false;
}
public boolean seekInHeader(byte[] pattern){
return false;
}
public List<byte[]> getListofPatterns(){
return null;
}
}
并尝试如下进行测试
@Test
public void autoMoveTest(){
FileOperations fo = mock(FileOperations.class);//stub
List<byte[]> dummyPatterns = new ArrayList<byte[]>();//specify stub value
dummyPatterns.add("amit".getBytes());
when(fo.getListofPatterns()).thenReturn(dummyPatterns);
when(fo.seekInHeader(anyString().getBytes())).thenReturn(true);
System.out.println(new String(fo.getListofPatterns().get(0)));
System.out.println(fo.seekInHeader("amit".getBytes()));
System.out.println(fo.autoMove());
assertTrue(fo.autoMove());
}
输出:
阿米特
真正
假
当我将seekHeader()设置为返回true时。 为什么fo.autoMove()返回false?
使用模拟时,除非您明确指定它们应该执行,否则这些方法实际上都不会执行任何操作。 模拟的全部要点是,该功能已被完全没有功能(默认)或存根的功能所取代。
模拟的默认功能是每个方法 都不执行任何操作 ,然后返回false
(对于布尔值),零(对于数字基元),空集合或null
。 因此,在这种情况下,除非您将其存根以执行其他操作,否则autoMove
将始终返回false
。
使用模拟的整个想法是您不会模拟 您要测试的类 。 相反,您可以模拟与之交互的其他类。 因此,如果类A
的方法调用类B
的方法,而您希望测试类A
; 那么您将使用类B
的模拟,并对被调用的B
方法进行存根。
您可以使用spy进行以下操作;
@Test
public void autoMoveTest(){
FileOperations fo = new FileOperations("");
FileOperations spyFo = spy(fo);
List<byte[]> dummyPatterns = new ArrayList<byte[]>();//specify stub value
dummyPatterns.add("amit".getBytes());
when(spyFo.getListofPatterns()).thenReturn(dummyPatterns);
when(spyFo.seekInHeader(anyString().getBytes())).thenReturn(true);//stubbing a method
assertTrue(spyFo.autoMove());
}
为什么您的代码失败
因为您没有对fo.autoMove()
进行存根。 当您使用模拟对象调用真实方法时,实际方法永远不会运行。 它只返回默认类型的返回值或存根值。 因此,即使您从autoMove()
返回true
,它也会为模拟对象返回false。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.