我继承了一些未测试的代码,哪些代码使用以下方法加载资源:
SomeClass.class.getClassLoader().getResource("somefile");
我已经编写了以下测试,但是与我创建的模拟类加载程序有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());
}
更新 - 通过ClassLoader添加资源我也尝试了以下操作
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());
您没有将cl
传递给任何东西。您可以为ClassLoader准备一个模拟器,然后继续使用加载SomeClass
的另一个 classloader加载资源。这就是为什么您在模拟中有0个互动的原因。
关于您的第一个问题,如果您以某种方式将模拟的classloader传递给实际加载资源的方法。例如,
之类的东西public boolean someMethod(Classloader loader) {
URL pathToLicense = loader.getResource("somefile");
return false;
}
但是我不得不说,IMO,此测试不是很有用,您应该嘲笑自己的组件,而不是Java类。如果您的目标模拟ClassLoader是在测试时注入其他文件,则更好的方法是更改代码以接收流并注入与文件中连接到文件的流并在测试中注入连接到内存中元素的流。
换句话说,当需要在测试时间更改时,资源会导致不良测试