Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何模拟MyClass.class.getClassLoader()?_Java_Mocking_Mockito - Fatal编程技术网

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
。我一直在绞尽脑汁想这个问题,但无法解决。将该文件作为测试资源的一部分,这不是正确的方法。当我编写单元测试时,我不能使用任何外部依赖项(文件系统)。你是如何解决的?