Java 如何模拟MyClass.class.getClassLoader()?
是否可以模拟(或至少抑制)这样的调用Java 如何模拟MyClass.class.getClassLoader()?,java,mocking,mockito,Java,Mocking,Mockito,是否可以模拟(或至少抑制)这样的调用 MyClass.class.getClassLoader().getResourceAsStream("file.txt") 使用PowerMock?一种解决方案(我认为这就是bayou.io在其中一条评论中的意思)将抽象出对资源的检索,如下所示: public interface ResourceRetriever{ public InputStream getResource(String location); } public class
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");
}
这种抽象还将使您的代码更加可重用,因为您可以轻松实现一个ResourceRetriever,它可以与Spring、s或其他变体一起工作。为这段代码创建一个包装器方法,然后模拟该方法?我需要模拟
getResourceAsStream
。我一直在绞尽脑汁想这个问题,但无法解决。将该文件作为测试资源的一部分,这不是正确的方法。当我编写单元测试时,我不能使用任何外部依赖项(文件系统)。你是如何解决的?