是否可以模拟(或至少抑制)此类调用
MyClass.class.getClassLoader().getResourceAsStream("file.txt")
使用PowerMock
?
最佳答案
一种解决方案(我认为这就是 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 一起使用的 ResourceRetriever Resources , URL s,Files或其他变体。
关于java - 如何模拟 MyClass.class.getClassLoader()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30493619/