【问题标题】:Mockito java - mock third party utility methods and private method callsMockito java - 模拟第三方实用方法和私有方法调用
【发布时间】:2020-09-03 11:54:15
【问题描述】:

我有一个遗留代码,其中有一些方法如下:

public void display(String fileName, Path path){
    //do some stuff
    Files.exists(path);
    if(null==privateMethod(fileName))
       //something
}

private Object privateMethod(String fileName){
   // do something
   return object;
}

我正在为 display 方法编写测试(使用 mockito)。我如何绕过像 Files.exists(path) 和内部私有方法调用这样的调用,因为我认为普通的存根不能与私有方法一起使用(可见性问题)。由于 Files.exists() 是实用方法,因此无法模拟。我是否需要在测试方法中实际创建一些测试文件并可能删除它们?或者有没有更好的清洁方法。我也搜索了私有方法测试 - 每个人都建议我不允许使用的 powermock。无论如何,我不需要测试私有方法,但 绕过/存根他们的调用返回。

【问题讨论】:

    标签: java unit-testing mockito


    【解决方案1】:

    在这种情况下,有一些文件进行测试是有意义的。您可以在文件夹src/test/resources中生成或预先创建它们。

    例如,测试可能如下所示:

    @Test
    public void myTest(){
        // MyFile.txt is in src/test/resources
        Path path = Paths.get("src","test","resources"); 
        service.display("MyFile.txt", path);
        // Asserts..
    }
    

    关于模拟私有方法,一般不推荐,因为你的测试将取决于你的类的实现细节,所以我强烈反对。此外,如果不允许您使用Powermock,则可能根本无法使用。

    但是还有其他选择,例如,如果私有方法使用一些外部服务或库,那么您可以模拟它们而不是整个方法。这个想法是模拟类所依赖的外部实体,而不是类本身的一部分。

    【讨论】:

    • 谢谢。关于模拟私有方法的行为有什么想法吗?
    • 嗨@nanosoft 我更新了我的答案。由于没有关于您的私有方法的详细信息,这是我能给您的最佳建议。
    猜你喜欢
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多