繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM