Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mockito测试-测试失败的原因_Java_Junit4_Mockito - Fatal编程技术网

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

昨天学了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;
    }
}
公共类文件操作{
公共布尔自动移动(){
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