我的应用程序使用包含配置设置的Singleton。这是代码:
private PropertiesSingleton() throws Exception {
InputStream appstream = this.getClass().getClassLoader()
.getResourceAsStream("application.properties");
props = new Properties();
try {
props.load(appstream);
} catch (IOException e) {
logger.log(Log.FATAL,
"Cannot find application.properties in classpath.", e);
throw e;
}
}
Normaly我的应用程序在容器内运行。对于我的unittest,我必须使application.properties可以加载。我试过这样的话:
@Before
public void init() throws Exception {
final FileInputStream inStream = new FileInputStream("../path/to/config/application.properties");
new NonStrictExpectations(ClassLoader.class) {
{
String.class.getClassLoader().getResourceAsStream("application.properties"); result = inStream;
}
};
}
测试无法启动,但打印此堆栈跟踪:
java.lang.VerifyError
at sun.instrument.InstrumentationImpl.redefineClasses0(Native Method)
at de.lpm.ejb.archiving.ArchiveHandlerBeanTest$2.<init>(ArchiveHandlerBeanTest.java:50)
at de.lpm.ejb.archiving.ArchiveHandlerBeanTest.init(ArchiveHandlerBeanTest.java:50)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.lang.reflect.Method.invoke(Method.java:597)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
答案 0 :(得分:0)
我认为根本不可能模拟ClassLoader,因为它首先存在。在类加载器出现之前你不能做的事情。所以尝试模拟调用者,而不是类加载器。
答案 1 :(得分:0)
我知道这已经过时了,但我想我仍然可以进入。你需要做的就是把它提取到你自己的Loader类中:
InputStream appstream = this.getClass().getClassLoader()
.getResourceAsStream("application.properties");
与此类似:
public class MyResourceLoader {
public InputStream getResource(String location){
this.getClass().getClassLoader().getResourceAsStream();
}
}
然后您只需使用新的“MyResourceLoader”,然后在测试中将其标记为@Mocked。我希望这会有所帮助。