2013-06-21 84 views
0

我的应用程序使用一个保存配置设置的Singleton。这是代码:使用JMockit嘲弄ResourceLoading

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; 
    } 
} 

通常我的应用程序在容器中运行。对于我的单元测试,我必须使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

我相信这是根本不可能嘲笑的ClassLoader,因为这是第一次出现。在类加载器存在之前,你不能做任何事情。所以试着嘲笑调用者,而不是类加载器。 。

0

我知道这是旧的,但我想我还是可以附和所有你需要做的是提取到自己的Loader类这样的:

InputStream appstream = this.getClass().getClassLoader() 
     .getResourceAsStream("application.properties"); 

与此类似:

public class MyResourceLoader { 
    public InputStream getResource(String location){ 
     this.getClass().getClassLoader().getResourceAsStream(); 
    } 
} 

然后,您只需使用新的“MyResourceLoader”,然后在测试中将其标记为@Mocked。我希望这有帮助。