2011-11-25 15 views
6

Mam fasolkę wiosenną, która ma element rejestratora i używam tego rejestratora do rejestrowania niektórych działań.
Również napisałem przypadek testowy, który używa SpringJUnit4ClassRunner. Mam skonfigurowane Log4j z pliku właściwości iw każdym przypadku testowego zainicjować rejestratora z tych właściwości:Log4j w JUnit Przypadek testowy

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

kiedy uruchomić test daje mi ostrzeżenie

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. 

Jednak rejestratora w mój komponent bean zapisuje wiadomości w określonej lokalizacji w pliku log4j.properties, tzn. działa poprawnie. Dlaczego log4j daje mi takie ostrzeżenia?

+0

Jako wyjście możesz przekazać do JVM '-Dlog4j.configuration = com/config/log4j.properties'. Wspomniany kod można usunąć. –

Odpowiedz

5

myślę powodem jest to kod w SpringJUnit4ClassRunner

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

Jeśli nie chcesz zobaczyć ostrzeżenie dotyczące log4j, zrób jak @DN zaproponował wystarczy dodać plik log4j.properties do ścieżki klasy aplikacji, w jeśli używasz struktury katalogów maven dodaj plik log4j.properties do (src/main/resources), który wyeliminuje ostrzeżenie.

2

Ponieważ Runner wykonuje biegi przed zainicjowaniem Log4J.

+0

Czy SpringJUnit4ClassRunner wymaga Log4j? Jeśli tak, jak mogę go skonfigurować przed uruchomieniem? – maks

+0

@maks Nie jest pewien, czy jest wymagany, czy korzysta z opakowania dziennika. Posiadanie "log4j.properties" w katalogu głównym ścieżki klas powinno wystarczyć, chociaż musisz go wypróbować. –

+0

@maks Commons rejestracja faktycznie, ale porady nadal mają zastosowanie. –

11

Chciałem zachować moją log4j config z domyślnej ścieżki klas, aby używać różnych protokołów z testami jednostkowymi produkcji &. Pracowałem nad nim poprzez podklasę SpringJUnit4ClassRunner i używanie statycznego inicjalizatora klasy.

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

zmiana do testu:

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

Teraz log4j jest skonfigurowany przed runner testu Wiosna jest wywoływany.

+0

gdzie umieścisz to w swojej strukturze paczki? –

+0

Zachowuję to w oddzielnym projekcie (w wyniku czego powstanie oddzielny słoik). W ten sposób mogę ponownie użyć klasy Test Runner między projektami. Dlatego dany pakiet jest nieistotny, z tym wyjątkiem, że musi znajdować się w klasie ścieżki testowej. – wbdarby

Powiązane problemy