Mockito测试-测试用例失败的原因



昨天学习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());
}

输出:

amit

真实

错误

当我设置seekHeader()返回true时。为什么fo.autoMove()返回false?

使用mock,除非您明确指定它们应该执行任何操作,否则没有任何方法实际执行任何操作。mock的全部意义在于,功能已经被替换,要么根本没有功能(默认情况下),要么被您存根的功能所替换。

mock的默认功能是每个方法都不执行任何操作,然后返回false(对于布尔值)、零(对于数字基元)、空集合或null。因此,在这种情况下,autoMove将始终返回false,除非您将其截断以执行不同的操作。

使用mock的整个想法是,不要模拟您试图测试的类。相反,您模拟它与之交互的其他类。因此,如果类A的方法调用类B的方法,并且您希望测试类A;然后您将使用类B的mock,并存根被调用的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,它也会为mock对象返回false。

相关内容

  • 没有找到相关文章

最新更新