2011-11-25 2 views
6

Ho un bean spring con un membro logger e utilizzo il logger per registrare alcune azioni.
Inoltre ho scritto un test case che utilizza SpringJUnit4ClassRunner. Ho configurato Log4j con un file di proprietà e in ogni caso di test ho inizializzare il logger con queste proprietà:Log4j in JUnit Test case

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

quando corro un test mi dà un avvertimento

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. 

Tuttavia, il logger in my bean scrive i messaggi nella posizione specificata in log4j.properties, cioè funziona correttamente. Perché log4j mi dà tali avvertimenti?

+0

Come via d'uscita è possibile passare '-Dlog4j.configuration = com/config/log4j.properties' a JVM. Il codice che hai menzionato può essere rimosso. –

risposta

5

Penso motivo è questo codice in SpringJUnit4ClassRunner

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

Se non si desidera visualizzare l'avviso per quanto riguarda log4j, basta fare come suggerito @DN basta aggiungere il file log4j.properties alla vostra applicazione percorso della classe, in caso se si utilizza la struttura di directory maven, aggiungere il file log4j.properties a (src/main/resources) che eliminerà l'avviso.

2

Perché il Runner viene eseguito prima che Log4J sia inizializzato.

+0

SpringJUnit4ClassRunner richiede Log4j? Se sì, come posso configurarlo prima dell'esecuzione del corridore? – maks

+0

@maks Non sono sicuro se è richiesto o se utilizza un wrapper di log. Avere un 'log4j.properties' nella radice del classpath dovrebbe essere sufficiente, anche se dovresti provarlo. –

+0

@maks Registrazione dei domini in realtà, ma il consiglio si applica ancora. –

11

Volevo mantenere la mia configurazione di log4j fuori dal percorso di classe predefinito per utilizzare la registrazione diversa con i test di unità produzione &. Ho lavorato intorno alla sottoclasse di SpringJUnit4ClassRunner e utilizzando un inizializzatore di classi statiche.

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

la modifica al test:

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

Ora log4j è configurato prima del test runner primavera viene richiamato.

+0

dove lo posizioni nella struttura del pacchetto? –

+0

Conservo questo in un progetto separato (risultante in un vaso separato). In questo modo posso riutilizzare la classe Test Runner tra i progetti. Pertanto, il pacchetto specifico è irrilevante, tranne per il fatto che deve trovarsi all'interno del classpath della classe di test. – wbdarby