내가 작성한 마지막 JUnit 테스트 케이스를 살펴보면서 클래스 생성자 내부에서 log4j의 BasicConfigurator.configure () 메서드를 호출했습니다. Eclipse의 “run as JUnit test case”명령에서 해당 단일 클래스 만 실행하는 데는 잘 작동했습니다. 그러나 나는 그것이 틀렸다는 것을 압니다. 우리의 메인 테스트 스위트가 하나의 프로세스에서 이러한 모든 클래스를 실행한다고 확신합니다. 따라서 log4j 구성이 더 높은 곳에서 일어나야합니다.
하지만 여전히 테스트 케이스를 자체적으로 실행해야하는데,이 경우 log4j를 구성하고 싶습니다. 테스트 케이스가 독립형으로 실행될 때 실행되도록 구성 호출을 어디에 넣어야하지만 테스트 케이스가 더 큰 스위트의 일부로 실행되는 경우에는 실행되지 않습니까?
답변
LogManager
되는 Log4j의 구성 클래스를 결정은 사용에 정적 블록 클래스가로드 될 때 실행. 최종 사용자를위한 세 가지 옵션이 있습니다.
log4j.defaultInitOverride
false로 지정 하면 log4j를 전혀 구성하지 않습니다.-
구성 파일의 경로를 직접 직접 지정하고 클래스 경로 검색을 재정의합니다. 다음 인수를 사용하여 구성 파일의 위치를 직접 지정할 수 있습니다
java
.-Dlog4j.configuration=<path to properties file>
테스트 실행기 구성에서.
-
테스트 중에 log4j가 log4j 구성 파일의 클래스 경로를 스캔하도록 허용합니다. (기본값)
온라인 설명서를 참조하십시오 .
답변
일반적으로 log4j.xml 파일을 src / test / resources에 넣고 log4j가 자체적으로 찾도록합니다. 코드가 필요하지 않으며 기본 log4j 초기화가이를 선택합니다. (일반적으로 내 로거를 ‘DEBUG’로 설정하고 싶습니다.)
답변
SLF4J (Simple Logging Facade for Java) 를 살펴볼 수 있습니다 . Log4j와 같은 초기 설정 호출이 필요하지 않은 Log4j를 감싸는 파사드입니다. API 차이가 적기 때문에 Slf4j 용 Log4j를 전환하는 것도 매우 쉽습니다.
답변
log4j.xml에서 시스템 속성을 사용합니다.
...
<param name="File" value="${catalina.home}/logs/root.log"/>
...
다음으로 테스트를 시작하십시오.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.16</version>
<configuration>
<systemProperties>
<property>
<name>catalina.home</name>
<value>${project.build.directory}</value>
</property>
</systemProperties>
</configuration>
</plugin>