Java Mockito测试-测试失败的原因
昨天学了JUnit,今天学了Mockito 我写了一个简单的类Java Mockito测试-测试失败的原因,java,junit4,mockito,Java,Junit4,Mockito,昨天学了JUnit,今天学了Mockito 我写了一个简单的类 public class FileOperations { public boolean autoMove(){ List<byte[]> patterns = getListofPatterns(); for(byte[] pattern: patterns){ System.out.println(new String(pattern));
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;
}
}
公共类文件操作{
公共布尔自动移动(){
List patterns=getListofPatterns();
for(字节[]模式:模式){
System.out.println(新字符串(模式));
如果(请参见页眉(图案)){
//移动具有特定扩展名的特定文件夹的文件的逻辑
返回true;
}
}
返回false;
}
公共布尔seekInHeader(字节[]模式){
返回false;
}
公共列表getListofPatterns(){
返回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());
}
@测试
public void autoMoveTest(){
FileOperations fo=mock(FileOperations.class);//存根
List dummyPatterns=new ArrayList();//指定存根值
添加(“amit.getBytes());
when(fo.getListofPatterns()).thenReturn(dummyPatterns);
当(fo.seekInHeader(anyString().getBytes())。然后返回(true);
System.out.println(新字符串(fo.getListofPatterns().get(0));
System.out.println(fo.seekInHeader(“amit.getBytes());
System.out.println(fo.autoMove());
assertTrue(fo.autoMove());
}
输出:
阿米特
真的
假的
我将seekHeader()设置为返回true。为什么fo.autoMove()返回false?对于mock,所有方法实际上都不做任何事情,除非您明确指定它们应该做什么。模拟的全部要点是,功能已经被替换,要么根本没有功能(默认),要么被您创建的功能替换 模拟的默认功能是,每个方法都不执行任何操作,然后返回
false
(对于布尔型)、零(对于数字基元)、空集合或null
。因此,在这种情况下,autoMove
将始终返回false
,除非您将其存根以执行其他操作
使用mock的整个想法是,你不要模拟你试图测试的类。相反,您可以模拟它与之交互的其他类。因此,如果类
a
的方法调用类B
的方法,并且您希望测试类a
;然后,您将使用类B
的模拟,并将调用的B
方法存根。使用模拟,所有方法实际上都不会做任何事情,除非您明确指定它们应该做什么。模拟的全部要点是,功能已经被替换,要么根本没有功能(默认),要么被您创建的功能替换
模拟的默认功能是,每个方法都不执行任何操作,然后返回false
(对于布尔型)、零(对于数字基元)、空集合或null
。因此,在这种情况下,autoMove
将始终返回false
,除非您将其存根以执行其他操作
使用mock的整个想法是,你不要模拟你试图测试的类。相反,您可以模拟它与之交互的其他类。因此,如果类
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());
}
@测试
public void autoMoveTest(){
FileOperations fo=新的FileOperations(“”);
FileOperations spyFo=spy(fo);
List dummyPatterns=new ArrayList();//指定存根值
添加(“amit.getBytes());
when(spyFo.getListofPatterns()).thenReturn(dummyPatterns);
when(spyFo.seekInHeader(anyString().getBytes()).thenReturn(true);//存根方法
assertTrue(spyFo.autoMove());
}
代码失败的原因
因为您没有对fo.autoMove()进行stubing
。当您使用模拟对象调用实际方法时,实际方法永远不会运行。它只返回返回类型或存根值的默认值。因此,即使您从autoMove()
返回true
,模拟对象也会返回false
@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());
}
@测试
public void autoMoveTest(){
FileOperations fo=新的FileOperations(“”);
FileOperations spyFo=spy(fo);
List dummyPatterns=new ArrayList();//指定存根值
添加(“amit.getBytes());
when(spyFo.getListofPatterns()).thenReturn(dummyPatterns);
when(spyFo.seekInHeader(anyString().getBytes()).thenReturn(true);//存根方法
assertTrue(spyFo.autoMove());
}
代码失败的原因
因为您没有对fo.autoMove()进行stubing。当您使用模拟对象调用实际方法时,实际方法永远不会运行。它只返回返回类型或存根值的默认值。因此,即使您从autoMove()
返回true
,模拟对象也会返回false。当(fo.seekInHeader(anyString().getBytes())时,这一行也不正确。然后返回(true)
,不要这样使用匹配器anyString().getBytes()
⇐ 错了!。因为数组是特殊对象,所以使用any(byte[].class)
。当前的匹配程序不执行类型检查,但预计在版本2.0.0.right@Brice中会更改。实际上,我不知道Mockito给了我什么。此外,当(fo.seekInHeader(anyString().getBytes())时,这行代码不正确。然后返回(true)
,不要这样使用匹配器anyString().getBytes()
⇐ 错了!。因为数组是特殊对象,所以使用any(byte[].class)
。当前的匹配器不执行类型检查,但它应该是c