java - 如何模拟 MyClass.class.getClassLoader()?

标签 java mocking mockito

是否可以模拟(或至少抑制)此类调用

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/

相关文章:

java - 在 Web Dynpro Java 的弹出窗口中显示所选行

java - 无法在 Spring Boot 中获取属性

java - Spring Boot中取消授权

unit-testing - 带模拟的测试套件。无法使用struct方法

java - 如何在hibernate中获取XML格式的查询结果?

java - jUnit 在测试中跳过注入(inject)模拟方法中的方法调用

python - 使用模拟测试 python 中的函数

android - 使用 Mockito 和 Dagger 的 SharedPreferences

java - Mockito 验证参数包含另一个忽略大小写的字符串

java - 如何使用 NoSuchAlgorithmException 和 KeyStoreException 覆盖 JUnit 的 block 捕获