我如何模拟MyClass.class.getClassLoader()?

时间:2015-05-27 21:39:03

标签: java mocking mockito

是否可以模拟(或至少抑制)这样的调用

MyClass.class.getClassLoader().getResourceAsStream("file.txt")

使用PowerMock

1 个答案:

答案 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 ResourcesURLFiles或其他变体一起使用的ResourceRetriever。