2

我继承了一些未经测试的代码,这些代码使用以下方法加载资源:

SomeClass.class.getClassLoader().getResource("somefile");

我编写了以下测试,但与我创建的 Mock 类加载器有 0 次交互。任何人都可以评论这种类型的测试是否可行。

public enum SomeClass {

    INSTANCE;

    public boolean someMethod() {
        URL pathToLicense = SomeClass.class.getClassLoader().getResource("somefile"); 
        return false;
    }
}



@Test
public void testLicenseWorkflow(){

    ClassLoader cl = PowerMockito.mock(ClassLoader.class);

    File f = new File("someFile");

    assertTrue(f.exists());

    logger.info(f.getCanonicalPath()  ); 

    when(cl.getResource("somefile")).thenReturn(f.toURL());

    verify(cl).getResource("somefile");

    assertTrue(SomeClass.INSTANCE.someMethod());

}

更新-通过类加载器添加资源 我也尝试了以下方法,但是 someMethod 这似乎也不起作用

new URLClassLoader(((URLClassLoader) SomeClass.INSTANCE.getClass().getClassLoader()).getURLs()) {
            @Override
            public void addURL(URL url) {
                super.addURL(url);
                logger.info("Calling add URL");
            }
        }.addURL(f.toURI().toURL());
4

1 回答 1

1

你没有传递cl给任何东西。您为类加载器准备了一个模拟,然后继续使用另一个类加载器加载资源,即已加载的类加载器SomeClass。这就是为什么你的模拟中有 0 次交互。

关于您的第一个问题,如果您以某种方式将模拟的类加载器传递给实际加载资源的方法,这是可能的。例如,像

public boolean someMethod(Classloader loader) {
  URL pathToLicense = loader.getResource("somefile"); 
  return false;
}

但我不得不说,IMO,这个测试不是很有用,你应该在模拟自己的组件,而不是 java 类。如果您模拟类加载器的目标是在测试时注入不同的文件,那么更好的方法是更改​​代码以接收 Stream 并在生产中注入连接到文件的流,并在测试中注入连接到内存中元素的流。

换句话说,当需要在测试时更改资源时,资源会导致错误的测试

于 2015-05-08T21:48:22.353 回答