2013-06-21 4 views
0

В моем приложении используется Singleton, который содержит настройки конфигурации. Это код:Mocking ResourceLoading с JMockit

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

Нормальное мое приложение запускается внутри контейнера. Для моего 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; 
     } 
    }; 
} 

тест не запускается, но печатать StackTrace:

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 в вашем тесте. Надеюсь, это поможет.

 Смежные вопросы

  • Нет связанных вопросов^_^