英文:
Mockito java - mock third party utility methods and private method calls
问题
我有一个遗留代码,其中有一些如下所示的方法:
public void display(String fileName, Path path){
//做一些操作
Files.exists(path);
if(null==privateMethod(fileName))
//一些操作
}
private Object privateMethod(String fileName){
// 做一些操作
return object;
}
我正在为display方法编写测试(使用mockito)。如何处理像是 Files.exists(path) 这样的调用以及内部私有方法的调用,因为我认为普通的存根(stubbing)在私有方法上无法使用(可见性问题)。由于 Files.exists() 是实用方法,所以无法进行模拟。我是否需要在测试方法中实际创建一些测试文件,然后可能将它们删除?或者是否有更好、更清晰的方法?我已经搜索过关于私有方法测试的内容 - 每个人都建议使用 powermock,但我不被允许使用它。无论如何,我不需要测试私有方法,而只需要绕过/存根它们的调用返回。
英文:
I have a legacy code which has some methods like below:
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;
}
I am writing tests(using mockito) for display method. How do I get around calls like Files.exists(path) and internal private method calls because I think normal stubbing cannot used with private method(visibility issue). As Files.exists() is utility method so cannot be mocked. Do I need to actually create some test files in testing method and probably delete them? Or is there a better clean way. Also I have searched regarding private method testing - everyone suggests powermock which Iam not allowed to use. Anyway I don't need to test private method but bypass/stub their call returns.
答案1
得分: 0
在这种情况下,为测试准备一些文件是有意义的。您可以在文件夹 src/test/resources 中生成它们或提前创建它们。
例如,一个测试可能如下所示:
@Test
public void myTest(){
// MyFile.txt 在 src/test/resources 中
Path path = Paths.get("src","test","resources");
service.display("MyFile.txt", path);
// 断言..
}
关于模拟私有方法,一般情况下不推荐,因为您的测试将依赖于类的实现细节,所以我强烈不建议这样做。而且,如果您不允许使用 Powermock
,这可能根本不可能实现。
但是有一些替代方法,例如,如果私有方法使用了一些外部服务或库,您可以模拟它们,而不是整个方法。这个想法是模拟类依赖的外部实体,而不是类本身的部分。
英文:
In this case makes sense to have some files for testing. You can generate them or create them in advance in the folder src/test/resources.
For example a test might look like this:
@Test
public void myTest(){
// MyFile.txt is in src/test/resources
Path path = Paths.get("src","test","resources");
service.display("MyFile.txt", path);
// Asserts..
}
Regarding mocking private methods, in general is not recommended because your test will depend on implementation details of your class, so I strongly discourage it. Furthermore, if you are not allowed to use Powermock
it might not be possible at all.
But there are alternatives, for example if the private method uses some external services or libraries, than you can mock them instead of the whole method. The idea is to mock the external entities that the class depends on rather than parts of the class itself.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论