2017-12-12 21 views
0

Java 로거의 상태를보고하도록 호출하는 테스트중인 코드가 있습니다. JUnit 테스트 코드에서이 로그 작성기에 올바른 로그 항목이 작성되었는지 확인하고 싶습니다. 예를 들어; 두 개의 개별 조건에 대해 2 개의 오류 로그가 있습니다.로그에서 메시지 단위 테스트 방법?

methodGoingToBeTested(bool a, bool b){ 
    if(a) 
     logger.info("a happened") 
    else() 
     logger.info("b happened") 

} 

@Test tester(){ 

    methodGoingToBeTested(true); 
    assertXXXXXX(loggedLevel(),Level.INFO); 
} 

나는 로거 오류의 나는 실제 방법에 위로가가가에 생성하기위한 것입니다 조건에 정확하게 생성되었는지 테스트하고 싶습니다. 온라인으로 확인했지만 조언은 정말 오래되었습니다. 누구든지 어떤 제안이 있습니까? 귀하의 도움을 주시면 감사하겠습니다.

나는 비슷한 게시물이 있지만 그 포스트는 정말로 구식이며이 프로세스를 지금이 문제를 해결하는 데 사용할 수 없다는 것을 알고있다. 그래서 나는이 질문을 맨 먼저 요구하고있다.

+0

어떤 로거를 사용하고 있습니까? log4j? – TruckDriver

+0

예 Log4j를 사용하려했지만 행운이 없었습니다 – Ferdz

+0

그 게시물은 실제로 날짜가 표시되어 있었고 그 조언은 정말 낡았습니다. 행운이 있기는하지만 그 게시물에 언급 된 모든 것을 시도했습니다. – Ferdz

답변

1

테스트 할 수없는 이유는 테스트중인 클래스에서 로거를 인스턴스화하기 때문입니다. 대신, 당신이 사용하는 경우

class MyClass 
{ 
    private final Logger logger = /* whatever */; 
} 

dependency injection 당신은 자신이 동작을 테스트 할 수 할 수 있습니다.

class MyClass 
{ 
    private final Logger logger; 

    MyClass(final Logger logger) 
    { 
     this.logger = logger; 
    } 
} 

이제 테스트에서 가짜 또는 로거를 삽입합니다. 당신이 원하는 경우

@Mock 
Logger logger; 

@Test 
void tester() 
{ 
    MyClass inst = new MyClass(logger); 

    methodUnderTest(true); 

    BDDMockito.verify(logger).info(Mockito.anyString()); 
} 

당신은 더 엄격한 검증을 수행 할 수 있습니다 : 여기 Mockito를 사용하여 간단한 예입니다.

똑같이, 조롱이 아닌 필요한 어설 션을 수행하는 테스트 용으로 가짜 로거 구현을 만들 수 있습니다. 여기에 아주 기본적인 예입니다 만 관찰 및 검증 동작이 로그 파일에 기록되어있는 경우

class FakeLogger implements Logger 
{ 
    private boolean hasInfoBeenCalled = false; 

    @Override 
    public void info(String message) 
    { 
     hasInfoBeenCalled = true; 
    } 

    // Other Logger methods... 

    public boolean hasInfoBeenCalled() 
    { 
     return hasInfoBeenCalled; 
    } 
} 

@Test 
void tester() 
{ 
    FakeLogger logger = new FakeLogger(); 
    MyClass inst = new MyClass(logger); 

    methodUnderTest(true); 

    Assert.assertTrue(logger.hasInfoBeenCalled()); 
} 

모든이가 말했다되고, 나는 신중 클래스의 디자인을 다시 생각합니다. 앞으로 로깅을 변경하기로 결정했다면, 테스트가 매우 취 약하다는 것을 알게 될 것입니다.