mock java.nio.file.Paths.get 除了抛出 InvalidPathException 什么都不做
mock java.nio.file.Paths.get do nothing but throw InvalidPathException
我有两行代码:
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,路径path = Paths.get( "report_はな.html");将抛出此 InvalidPathException。
如文档所述here,您必须跳过一些环节才能模拟 "system" classes,即由系统加载的 classes class装载机。
具体来说,在普通的 PowerMock 测试中,@PrepareForTest()
注释标识要模拟其静态方法的 class,而在 "system" PowerMock 测试中,注释需要标识class 即 调用 静态方法(通常是 class 被测)。
例如,假设我们有以下 class:
public class Foo {
public static Path doGet(File f) throws IOException {
try {
return Paths.get(f.getCanonicalPath());
} catch (InvalidPathException e) {
return null;
}
}
}
如果 Paths.get()
抛出一个 InvalidPathException
,我们想测试这个 class 事实上 return null
。为了测试这个,我们写:
@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())
.
我有两行代码:
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,路径path = Paths.get( "report_はな.html");将抛出此 InvalidPathException。
如文档所述here,您必须跳过一些环节才能模拟 "system" classes,即由系统加载的 classes class装载机。
具体来说,在普通的 PowerMock 测试中,@PrepareForTest()
注释标识要模拟其静态方法的 class,而在 "system" PowerMock 测试中,注释需要标识class 即 调用 静态方法(通常是 class 被测)。
例如,假设我们有以下 class:
public class Foo {
public static Path doGet(File f) throws IOException {
try {
return Paths.get(f.getCanonicalPath());
} catch (InvalidPathException e) {
return null;
}
}
}
如果 Paths.get()
抛出一个 InvalidPathException
,我们想测试这个 class 事实上 return null
。为了测试这个,我们写:
@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())
.