Java 我可以模拟方法内部的文件.mkdirs()吗

Java 我可以模拟方法内部的文件.mkdirs()吗,java,file,junit,mocking,Java,File,Junit,Mocking,下面是我的遗留代码。我不想创建一个实际的文件夹。相反,我想创建一个临时文件夹,它必须在测试执行结束后删除 Public class MainClass() { public void m1() { m2(); } private void m2() { File f=new File(); f.mkrdirs() } } 这是我的测试课 public class TestClass{ @Rule public Tem

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

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();
生产代码为file类调用new。 在测试代码中,您执行以下操作:

File fileSpy = mock(File.class);
那个间谍和你的f实例有什么关系?答:一点也不

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

现在您有了这些选项:

查看是否可以更改生产代码,以便以某种方式传入文件实例。要么将其作为一个参数,即您确实可以将某些内容传递给它,要么将f转换为类的一个字段,然后使用Mockito的@InjectMock注释 如果您被生产代码所困扰,Mockito不会这样做。然后你需要PowerMockito或JMockit。 通常,我建议人们坚持使用普通的Mockito,避免模仿新的,更不要像瘟疫一样通过PowerMockito模仿静态调用


但是测试遗留代码是一种情况,您必须在根本不测试还是使用PowerMockito测试之间进行选择。所以,如果您不能更改生产代码,那么您唯一的选择就是模拟对new的调用。请参阅以了解如何执行此操作。

您的问题从这里开始:

File f=new File();
生产代码为file类调用new。 在测试代码中,您执行以下操作:

File fileSpy = mock(File.class);
那个间谍和你的f实例有什么关系?答:一点也不

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

现在您有了这些选项:

查看是否可以更改生产代码,以便以某种方式传入文件实例。要么将其作为一个参数,即您确实可以将某些内容传递给它,要么将f转换为类的一个字段,然后使用Mockito的@InjectMock注释 如果您被生产代码所困扰,Mockito不会这样做。然后你需要PowerMockito或JMockit。 通常,我建议人们坚持使用普通的Mockito,避免模仿新的,更不要像瘟疫一样通过PowerMockito模仿静态调用


但是测试遗留代码是一种情况,您必须在根本不测试还是使用PowerMockito测试之间进行选择。所以,如果您不能更改生产代码,那么您唯一的选择就是模拟对new的调用。有关如何执行此操作,请参阅。

是否要在不创建目录文件夹的情况下运行测试?@PareshLomate yes是否要在不创建目录文件夹的情况下运行测试?@PareshLomate yes