2016-11-28 41 views
2

創建日誌,我有以下代碼:我如何斷定我的日誌消息時由龍目島

@Component 
@Slf4j 
public class MyClass { 

    private OtherClass otherClass; 

    @Autowired 
    public MyClass(OtherClass otherClass) { 
     this.otherClass = otherClass; 
    } 

    public void start() { 
     try { 
      otherClass.execute(); 
     } catch (FeatureException exception) { 
      log.warn(exception.getMessage()); 
     } 
    } 

我想要做的測試,以驗證日誌消息。 我不知道如何。

感謝

+0

如果您需要驗證日誌消息,那可能是代碼異味。你能詳細說明爲什麼你需要驗證日誌消息嗎? –

+1

@AlastorMoody存在一些需要特定消息的使用案例:客戶端請求正確記錄此特定消息,因爲其他工具期望它;一個項目經理說,我想要100%的代碼覆蓋率,包括日誌語句等。 –

+0

您可以製作一個程序包專用異常(PPE),它擴展了您的FeatureException異常。這個PPE有一個logMessage()方法,它可以構造你想要的消息,而不用詢問調用代碼的消息。此PPE爲您提供所需的日誌消息,並且在您的單元測試中可以檢查是否引發了包私有異常。來自公共調用者,他們仍然可以捕獲FeatureException。這是否能解決您的問題?如果這有效,那麼我可以將此評論轉換爲答案,以便您可以接受它。如果沒有,你可以在logMessage上使用assertEquals。 –

回答

1

SLF4J project recommends using用於該用途的情況下,庫SLF4J Test

在你的情況(使用Hamcrest和作爲的Mockito井):

public class MyClassTest { 

    TestLogger logger = TestLoggerFactory.getTestLogger(MyClass.class); 

    @Test 
    public void testStart_loggingFailureMessage() { 
    OtherClass otherClass = mock(OtherClass.class); 
    MyClass myClass = new MyClass(otherClass); 

    when(otherClass.execute()).thenThrow(new FeatureException("Some text")); 

    myClass.start(); 

    assertThat(logger.getLoggingEvents(), is(asList(LoggingEvent.warn("Some text")))); 
    } 

    @After 
    public void clearLoggers() { 
    TestLoggerFactory.clear(); 
    } 
} 
0

萬一其他的解決辦法不爲你工作,另外一個選擇:你可以驗證例外通過otherClass.execute()

拋出

A)認爲,以getMessage()

B)被釣到了一條通話(你可以寫一個測試拋出一個運行時異常,你會希望打你的測試用例,並拋出一個FeatureException第二測試...這顯然不應該在測試用例中使用)。