2011-11-25 77 views
6

我有一個spring bean,它有一個記錄器成員,我使用該記錄器記錄一些操作。
另外我寫了一個使用SpringJUnit4ClassRunner的測試用例。我有一個屬性文件配置Log4j和在每個測試情況下,我初始化這些屬性的記錄:JUnit中的Log4j測試用例

@BeforeClass 
public static void init() { 
    PropertyConfigurator.configure("src/com/config/log4j.properties"); 
} 

當我運行一個測試它給了我一個警告

log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.SpringJUnit4ClassRunner). 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 

然而,在記錄器我的bean將消息寫入log4j.properties中的指定位置,即它可以正常工作。 爲什麼log4j會給我這樣的警告?

+0

作爲出路,您可以將'-Dlog4j.configuration = com/config/log4j.properties'傳遞給JVM。您提到的代碼可以被刪除。 –

回答

5

我想原因是這樣的代碼基於SpringJUnit4ClassRunner

public SpringJUnit4ClassRunner(Class<?> clazz) throws InitializationError { 
    super(clazz); 
    if (logger.isDebugEnabled()) { 
     logger.debug("SpringJUnit4ClassRunner constructor called with [" + clazz + "]."); 
    } 
    this.testContextManager = createTestContextManager(clazz); 
} 

如果你不希望看到有關log4j的警告,只是因爲@DN提示只需添加log4j.properties文件到您的應用程序類路徑,在如果您使用maven目錄結構,請將log4j.properties文件添加到(src/main/resources),以消除警告。

2

因爲執行在Log4J初始化之前運行。

+0

SpringJUnit4ClassRunner是否需要Log4j?如果是,我如何在跑步者執行前配置它? – maks

+0

@maks不確定是否需要它或使用日誌包裝器。在classpath根目錄下有一個'log4j.properties'就足夠了,儘管你必須嘗試一下。 –

+0

@maks Commons logging實際上,但建議仍然適用。 –

11

我想保留我的log4j配置出默認的類路徑使用不同的日誌記錄與單元測試&生產。我通過繼承SpringJUnit4ClassRunner並使用靜態類初始化器來解決它。

// The new test runner 
public class JUnit4ClassRunner extends SpringJUnit4ClassRunner { 

    static { 
    try { 
     Log4jConfigurer.initLogging("classpath:test/log4jconfig.xml"); 
    } 
    catch(FileNotFoundException ex) { 
     System.err.println("Cannot Initialize log4j"); 
    } 
    } 

    public JUnit4ClassRunner(Class<?> clazz) throws InitializationError { 
    super(clazz); 
    } 
} 

換到測試:

@RunWith(JUnit4ClassRunner.class) 
@ContextConfiguration 
@TransactionConfiguration 
@Transactional 
public class LmpDaoImplTest extends AbstractTransactionalJUnit4SpringContextTests { 
... 

現在的log4j是在Spring測試運行時調用之前配置。

+0

你把它放在你的包裝結構中? –

+0

我把它保存在一個單獨的項目中(導致一個單獨的jar)。以這種方式,我可以在項目之間重用Test Runner類。因此,特定的包是不相關的,除了它必須在測試類的類路徑中。 – wbdarby