我有两行代码:
File file = new File("report_はな.html");
Path path = Paths.get(file.getCanonicalPath());
无论如何,我可以模拟静态方法:
Paths.get(file.getCanonicalPath());
只抛出异常InvalidPathException?
我尝试过powermockito,但似乎无法正常工作
PowerMockito.mockStatic(Paths.class);
PowerMockito.doReturn(null).doThrow(new InvalidPathException("","")).when(Paths.class);
整个想法是我正在尝试重现在英语Mac下的错误,Mac默认编码设置是US-ASCII,其路径= Paths.get(" report_はな.html&#34 );将抛出此InvalidPathException。
答案 0 :(得分:2)
如记录here所述,你必须跳过一些箍来模拟"系统"类,即由系统类加载器加载的类。
具体而言,在正常的PowerMock测试中,@PrepareForTest()
注释在"系统"中标识了要模拟其静态方法的类。 PowerMock测试注释需要识别调用静态方法的类(通常是被测试的类)。
例如,假设我们有以下课程:
public class Foo {
public static Path doGet(File f) throws IOException {
try {
return Paths.get(f.getCanonicalPath());
} catch (InvalidPathException e) {
return null;
}
}
}
如果null
抛出Paths.get()
,我们想要测试此类确实返回InvalidPathException
。为了测试这个,我们写道:
@RunWith(PowerMockRunner.class) // <- important!
@PrepareForTest(Foo.class) // <- note: Foo.class, NOT Paths.class
public class FooTest {
@Test
public void doGetReturnsNullForInvalidPathException() throws IOException {
// Enable static mocking on Paths
PowerMockito.mockStatic(Paths.class);
// Make Paths.get() throw IPE for all arguments
Mockito.when(Paths.get(any(String.class)))
.thenThrow(new InvalidPathException("", ""));
// Assert that method invoking Paths.get() returns null
assertThat(Foo.doGet(new File("foo"))).isNull();
}
}
注意:我写了Paths.get(any(String.class))
但您可以嘲笑更多内容
具体如果需要,例如Paths.get("foo"))
或Paths.get(new File("report_はな.html").getCanonicalPath())
。