[java] JUnit 테스트 클래스에서 log4j를 어디에서 구성합니까?

내가 작성한 마지막 JUnit 테스트 케이스를 살펴보면서 클래스 생성자 내부에서 log4j의 BasicConfigurator.configure () 메서드를 호출했습니다. Eclipse의 “run as JUnit test case”명령에서 해당 단일 클래스 만 실행하는 데는 잘 작동했습니다. 그러나 나는 그것이 틀렸다는 것을 압니다. 우리의 메인 테스트 스위트가 하나의 프로세스에서 이러한 모든 클래스를 실행한다고 확신합니다. 따라서 log4j 구성이 더 높은 곳에서 일어나야합니다.

하지만 여전히 테스트 케이스를 자체적으로 실행해야하는데,이 경우 log4j를 구성하고 싶습니다. 테스트 케이스가 독립형으로 실행될 때 실행되도록 구성 호출을 어디에 넣어야하지만 테스트 케이스가 더 큰 스위트의 일부로 실행되는 경우에는 실행되지 않습니까?



답변

LogManager되는 Log4j의 구성 클래스를 결정은 사용에 정적 블록 클래스가로드 될 때 실행. 최종 사용자를위한 세 가지 옵션이 있습니다.

  1. log4j.defaultInitOverridefalse로 지정 하면 log4j를 전혀 구성하지 않습니다.
  2. 구성 파일의 경로를 직접 직접 지정하고 클래스 경로 검색을 재정의합니다. 다음 인수를 사용하여 구성 파일의 위치를 ​​직접 지정할 수 있습니다 java.

    -Dlog4j.configuration=<path to properties file>

    테스트 실행기 구성에서.

  3. 테스트 중에 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>


답변