2014-04-10 1 views
1

나는 this question에 노출 된 것과 비슷한 문제에 직면하고 있지만, 다르고 잘하면 해결하기가 더 쉽다고 생각합니다.클래스 경로 순서는 JUnit 러너에 따라 다릅니다

MyClass을 테스트하는 단위 테스트 클래스 TestMyClass이 있고 MyClass에는 log4j 로거에 대한 정적 참조가 있습니다.

TestMyClas@RunWith(MockitoJUnitRunner.class)으로 실행하면 로거 초기화가 정상적으로 진행됩니다.

의 log4j : 나는 @RunWith(PowerMockRunner.class) 테스트를 실행할 때 로거 초기화하는 동안 그러나, 다음과 같은 오류가 log4j에 의해 기록되는 오류 A "를 org.apache.log4j.xml.DOMConfigurator"객체는 "조직에 할당 할 수없는 .apache.log4j.spi.Configurator "변수에 있습니다.
의 log4j : ERROR [[email protected]]
유형의 오브젝트의 log4j 반면 : "org.apache.log4j.spi.Configurator"에 의해로드
Log4j의 클래스 에러 ERROR "조직 .apache.log4j.xml.DOMConfigurator "가 [[email protected]]에 의해로드되었습니다.
log4j : ERROR 구성자 [org.apache.log4j.xml.DOMConfigurator]를 인스턴스화 할 수 없습니다. DomConfiguratorConfigurator 구현

Configurator.class.isAssignableFrom(DOMConfigurator.class) 

이 진실해야하지만, 나는 내가 일어날 때문에 false를 반환 생각 :

나는 다음 코드는 Log4j의 초기화 코드에 false를 반환하기 때문에 이런 것을 알아 냈다 클래스 패스에는 log4j-1.2.14와 log4j-extras-1.1의 두 가지 버전이 있습니다. 그리고 테스트가 PowerMockRunner으로 실행될 때 두 개의 클래스가 같은 jar에서로드되지 않는다고 가정합니다 (다른 이유가있을 경우 알려주십시오).

그래서 나는 이해하고 싶습니다 :

  • 가 왜이 문제에 직면합니까? JUnit 러너에 따라 클래스 패스 순서가 다른 이유는 무엇입니까? 결정 론적이라고 생각하지 않습니까?
  • 이 문제를 해결할 방법이 있습니까?

N.B :는 내가 정적 전화를 조롱 할 필요가 있기 때문에, PowerMockRunner을 사용해야합니다. log4j 항아리 중 하나를 제거 할 수 없습니다. 왜냐하면 둘 다 내 프로젝트의 의존성에 의존하기 때문입니다. 이 문제는 내 테스트가 실패하지 않고, 그냥 그 오류를 인쇄하지만, 여전히 해결하는 것이 좋을 것입니다.

답변

3
우리가 바로 @PrepareForTest 주석에서, 그러나, 우리는 정적 메서드를 조롱 PowerMock를 사용하는 테스트 클래스 중 하나를이 작업을 수행했다 상단이가 왜 더 이상 정확히 기억하지

:

@PowerMockIgnore({ "org.apache.log4j.*", "org.apache.commons.logging.*" }) 

PowerMock FAQ의 5 번은 이것이 필요한 이유를 제시하고 다른 해결책을 제시합니다. log4j를 무시하면 우리에게 도움이되었습니다.

P. 우리는 PowerMock 1.5.1을 사용하고 있습니다.

+0

FAQ의이 섹션을 어떻게 놓쳤는지 잘 모르겠지만 완벽하게 작동합니다. 감사! – Djizeus

관련 문제