如何使用 Powermockito 模拟以 public 静态方法编写的 "new FileOutputStram()"

how to mock "new FileOutputStram()" written in public static method using Powermockito

问题:我正在为一种方法编写测试用例,从中调用具有以下代码的 public 静态方法:

final File file = new File(filePath);
    final OutputStream out = new FileOutputStream(file);
    out.write(bytes);
    out.close();

现在我需要模拟上面的调用。

我写的:-

@Before
public void setUp() throws Exception{
  File myFile = PowerMockito.mock(File.class);
  FileOutputStream outStream = PowerMockito.mock(FileOutputStream.class);

  PowerMockito.whenNew(File.class).withAnyArguments().thenReturn(myFile);        
  PowerMockito.whenNew(FileOutputStream.class).withAnyArguments().thenReturn(outStream);

  doNothing().when(outStream).write(Matchers.any());
  doNothing().when(outStream).close();
}

@Test
public void testMethod(){
  PowerMockito.mockStatic(StaticClassUtil.class);
  PowerMockito.when(StaticClassUtil.uploadFile(file.getBytes(), "dummy","dummy","dummy", null)).thenReturn("dummy");        
}

调试时我发现 No mock object at line :

    final File file = new File(filePath);

请指出我错在哪里。

很可能您错过了 documentation 中概述的步骤之一 - 可能您忘记了对 File.class 和 FileOutputStream.class.

使用 @PrepareForTest

但真正的答案是:您不一定必须直接在您的代码中调用new。您可以求助于依赖项注入框架来为您执行此操作,或者只是将 OutputStream passed 放入您的测试方法中。因为那时你只需要 传递 一个模拟对象,而你需要模拟那些对 new() 的讨厌调用就消失了。你可以坚持使用好的旧 Mockito 而不是 PowerMock(ito)。