2014-12-20 29 views
0

我在XML配置文件中有一些信息(例如log4j2日誌保存文件夾的路徑)並希望在Spring開始加載之前加載它們。但在彈出和拋出異常之前,執行static@BeforeClass(log4j2無法找到系統屬性,我想在XML配置文件加載期間定義它)。JUnit - 如何在Spring開始加載之前運行一個方法?

如何在Spring開始加載之前運行一些方法?

我使用Spring Boot(Start.class作爲入口點)。

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = Start.class) 
// @ContextConfiguration(classes = { Start.class }, loader = SpringApplicationContextLoader.class) 
@WebAppConfiguration 
@IntegrationTest 
@FixMethodOrder(MethodSorters.NAME_ASCENDING) 
public class FileUploadTest { 

    @Autowired 
    private SomeClazz clazz; 

    static { 
     System.out.println("Static"); 
     assertNotNull("Conf file is not specified", System.getProperty("conf")); 
     ConfigLoader.initConfiguration(System.getProperty("conf")); 
    } 

    @Before 
    public void setUp() { 
     System.out.println("setUp"); 
    } 

    @BeforeClass 
    public static void oneTimeSetUp() { 
     System.out.println("oneTimeSetUp"); 
    } 

    @Test 
    public void myTest() throws IOException { 

運行輸出:

二○一四年十二月二十○日14:15:46614錯誤無法創建文件 $ {SYS:logsPath} /sql.log產生java.io.IOException:Názevsouboru CIadresáře 尼波jmenovka svazku JEnesprávná處 org.apache.logging.log4j.core.appender.rolling java.io.WinNTFileSystem.createFileExclusively(本機方法)在 java.io.File.createNewFile(來源不明)。 RollingFileManager $ RollingFileManagerFactory.createManager(RollingFileManager.java:306) at org.apache.logging.log4j.core.appender.rolling.RollingFileManager $ RollingFileManagerFactory.createManager(RollingFileManager.java:290) at org.apache.logging.log4j.core.appender.AbstractManager.getManager(AbstractManager。的java:71) 在 org.apache.logging.log4j.core.appender.OutputStreamManager.getManager(OutputStreamManager.java:60) 在 org.apache.logging.log4j.core.appender.rolling.RollingFileManager.getFileManager( RollingFileManager.java:79) 在 org.apache.logging.log4j.core.appender.RollingFileAppender.createAppender(RollingFileAppender.java:184) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法)在 sun.ref在 sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) java.lang.reflect.Method.invoke(Unknown Source) org.apache.logging.log4j.core.config .plugins.util.PluginBuilder.build(PluginBuilder.java:135) 在 org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:766) 在 org.apache.logging.log4j .core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:706) 在 org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:698) 在 org.apache.logging.log4j .core.co nfig.AbstractConfiguration.doConfigure(AbstractConfiguration.java:358) 在 org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:161) 在 org.apache.logging.log4j.core。 LoggerContext.setConfiguration(LoggerContext.java:359) 在 org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:420) 在 org.apache.logging.log4j.core.LoggerContext.start( LoggerContext.java:138) 在 org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:147) 在 org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext( Log4jContextFactory.jav a:41) at org.apache.logging.log4j.LogManager.getContext(LogManager。的java:175) 在 org.apache.logging.log4j.spi.AbstractLoggerAdapter.getContext(AbstractLoggerAdapter.java:102) 在 org.apache.logging.slf4j.Log4jLoggerFactory.getContext(Log4jLoggerFactory.java:43) 在 org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:42) 在 org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29) 在org.slf4j.LoggerFactory。 getLogger(LoggerFactory.java:288)在 org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:156) 在 org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java :132 ) 在org.apache.commons.logging.LogFactory.getLog(LogFactory.java:274) 在 org.springframework.test.context.junit4.SpringJUnit4ClassRunner。(SpringJUnit4ClassRunner.java:86) 在sun.reflect.NativeConstructorAccessorImpl .newInstance0(本地 法)以 sun.reflect.NativeConstructorAccessorImpl.newInstance(來源不明) 在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(未知 來源)在java.lang.reflect.Constructor.newInstance(來源不明) 在 org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104) at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(Anno tatedBuilder.java:86) 在 org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) 在 org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26) 在 org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) 在 org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33) 在 org.eclipse.jdt.internal .junit4.runner.JUnit4TestReference。(JUnit4TestReference.java:33) 在 org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference。(JUnit4TestClassReference.java:25) 在 org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48) 在 org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:444) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

二○一四年十二月二十零日14:15:46617 ERROR無法調用類 類org.apache.logging.log4j.core.appender.RollingFileAppender工廠方法用於 元件RollingFile。 java.lang.reflect.InvocationTargetException在在在 sun.reflect.DelegatingMethodAccessorImpl.invoke(來源不明) sun.reflect.NativeMethodAccessorImpl.invoke(來源不明) sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法)在 的Java。 lang.reflect.Method.invoke(Unknown Source)at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:135) at org.apache.logging.log4j。 core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration。的java:766) 在 org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:706) 在 org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration。的java:698) 在 org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:358) 在 org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration。 java:161) at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:359) at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java: 420) 在 org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:138) 在 org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:147) 在 org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:41) 在 org.apache.logging.log4j.LogManager.getContext(LogManager.java:175) 在 有機.apache.logging.log4j.spi.AbstractLoggerAdapter.getContext(AbstractLoggerAdapter.java:102) 在 org.apache.logging.slf4j.Log4jLoggerFactory.getContext(Log4jLoggerFactory.java:43) 在 org.apach e.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:42) 在 org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29) 在org.slf4j.LoggerFactory.getLogger(的LoggerFactory的.java:288)在 org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:156) 在 org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:132) 在org.apache.commons.logging.LogFactory.getLog(LogFactory.java:274) 在 org.springframework.test.context.junit4.SpringJUnit4ClassRunner。(SpringJUnit4ClassRunner.java:86) 在sun.reflect.NativeConstructorAccessorImpl。 newInstance0(原生 法)以 sun.reflect.NativeConstructorAccessorImpl.newInstance(來源不明) 在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(未知 來源)在java.lang.reflect.Constructor.newInstance(來源不明) 在 org.junit。 internal.builders.AnnotatedBuilder.buildRunner在 org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)(AnnotatedBuilder.java:104) 在 org.junit.runners.model.RunnerBuilder.safeRunnerForClass( RunnerBuilder.java:59) at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26) at 個org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) 在 org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33) 在 org.eclipse.jdt.internal .junit4.runner.JUnit4TestReference。(JUnit4TestReference.java:33) 在 org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference。(JUnit4TestClassReference.java:25) 在 org.eclipse.jdt.internal.junit4 .runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48) 在 org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38) 在 org.eclipse.jdt.internal.junit .runner。RemoteTestRunner.runTests(RemoteTestRunner.java:444) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 在 org.eclipse.jdt.internal.junit.runner。 RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 引起:java.lang.IllegalStateException:無法創建管理器 在 org.apache.logging.log4j.core.appender.AbstractManager.getManager(AbstractManager.java:73) 在 org.apache.logging.log4j.core.appender.OutputStreamManager.getManager(OutputStreamManager.java:60) 在 org.apache.logging.log4j.core.appender.rolling.RollingFileManager.getFileManager(RollingFileManager.java:79) 在 org.apache.logging.log4j.core.appender.RollingFileAppender.createAppender(RollingFileAppender.java:184) ... 43更多

2014-12-20 14:15:46,619錯誤返回給RollingFile的空對象 Appenders。 [20.12.2014 14:15:46.749] PID $ {sys:PID} INFO [main] - WebTestContextBootstrapper:使用TestExecutionListeners: [[email protected]41ee392b, org.springframework.test。 [email protected]9, org.springfra[email protected]57d5872c, org.springframew[email protected]667a738, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener @ 36f0f1be] Static

+0

當您開始測試時,只會執行一次靜態塊。在開始使用實際設置方法之前,課前也只會運行一次。所以我不明白這個問題是什麼。 – SMA

+0

我已經添加了一個控制檯輸出。在log4j2錯誤之後打印static,所以我認爲Spring在靜態執行之前加載。 – Xdg

+0

sys:logsPath是我想在XML配置文件加載期間定義的一個系統屬性(在Spring開始加載log4j2之前)。 – Xdg

回答

0

我不清楚爲什麼不調用靜態塊。但作爲解決方案,我建議將log4j2.xml添加到src/test/resources中,並刪除所有系統屬性 - JUnit測試不需要登錄到文件。

SpringJUnit4ClassRunner然後加載一個src/test/resources/log4j2.xml,然後執行所有的JUnit方法(@BeforeClass,@Test ..)。

相關問題