如何使用 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)。
问题:我正在为一种方法编写测试用例,从中调用具有以下代码的 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)。