首页 > 解决方案 > Mockito java - 模拟第三方实用方法和私有方法调用

问题描述

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

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;
}

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

标签: javaunit-testingmockito

解决方案


在这种情况下,有一些文件进行测试是有意义的。您可以在文件夹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它可能根本不可能。

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


推荐阅读