是否可以模拟(或至少抑制)这样的调用
MyClass.class.getClassLoader().getResourceAsStream("file.txt")
使用PowerMock
?
答案 0 :(得分:0)
一个解决方案(我认为这是其中一条评论中的bayou.io意味着)将抽象出资源的检索,如:
public interface ResourceRetriever{
public InputStream getResource(String location);
}
public class ClassloaderResourceRetriever implements ResourceRetriever{
@Override
public InputStream getResource(String location){
this.getClass().getClassLoader().getResourceAsStream();
}
}
public class MyClassThatNeedsSomeResources {
private final ResourceRetriever resourceRetriever;
public MyClassThatNeedsSomeResource (ResourceRetriever resourceRetriever){
this.resourceRetriever = resourceRetriever;
}
public void myMethodThatNeedsSomeResource(){
InputStream resource = resourceRetriever.getResource("foo");
// use your newly retrieved resource
}
}
多亏了这个,您可以轻松地模拟出检索器,如
...
@Test
public void resourceShouldBeRetrieved() {
// given
ResourceRetriever r = Mockito.mock(ResourceRetriever.class);
ByteArrayInputStream fakeResource = new ByteArrayInputStream("foobar".getBytes());
when(r.getResource("foo").thenReturn(fakeResource);
MyClassThatNeedsSomeResources c = new MyClassThatNeedsSomeResources(r);
// when
c.myMethodThatNeedsSomeResource();
// then
verify(r).getResource("foo");
}
此抽象还将使您的代码更具可重用性,因为您可以轻松实现与Spring Resources,URL,Files或其他变体一起使用的ResourceRetriever。