gpt4 book ai didi

java - 我可以模拟方法内部的 file.mkdirs() 吗

转载 作者:行者123 更新时间:2023-12-01 16:44:11 28 4
gpt4 key购买 nike

下面是我的旧代码。我不想创建实际的文件夹。相反,我想创建一个临时文件夹,在测试执行结束后必须将其删除。

Public class MainClass() {
public void m1() {
m2();
}

private void m2() {
File f=new File();
f.mkrdirs()
}
}

这是我的测试类

public class TestClass{
@Rule
public TemporaryFolder folder= new TemporaryFolder();

public void testM1(){
File fileSpy = mock(File.class);
Mockito.doNothing().when(fileSpy.mkdir());

}
}

但不起作用。有什么线索吗?

最佳答案

您的问题从这里开始:

File f=new File();

您的生产代码为文件类调用new。在您的测试代码中,您执行以下操作:

File fileSpy = mock(File.class);

该 spy 与您的 f 实例有何关系?答:完全没有。

在测试中声明 spy 并不会神奇地让您的生产代码使用它!因此,您必须确保当您的生产代码使用该 f 对象时... f 应该是您的 fileSpy

现在您有以下选择:

  • 看看是否可以更改生产代码,以便可以以某种方式传入文件实例。要么将其作为一个参数,您确实可以将某些内容传递给它,要么将 f 转换为类的字段,然后使用 Mockito 的 @InjectMock 注释
  • 如果您被生产代码所困扰,Mockito 就不行了。那么你需要 PowerMock(ito) 或 JMockit。

通常,我建议人们坚持使用普通的 Mockito,并避免像瘟疫一样通过 PowerMock(ito) 模拟 new() (更不用说模拟静态调用)。

但是测试遗留代码是一种情况,您必须在“根本不测试”或“使用 PowerMock(ito) 测试”之间做出选择。因此,如果您无法更改生产代码,那么您唯一的选择就是模拟对 new() 的调用。请参阅here了解如何做到这一点。

关于java - 我可以模拟方法内部的 file.mkdirs() 吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56053293/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com