2016-06-30 40 views
1

は、私はJUnitのテストを書き込もうとしています方法です:私がテストしたいJunitを使用してLogback Logステートメントが呼び出されたことをテストしますか?以下

方法:

//logger declared outside of method in Class 
    private static Logger LOGGER = LoggerFactory.getLogger(PersonService.class); 

    public void showOutputOfIdentifications(int age) { 

     if(age>25){ 

      LOGGER.info("Over 25"); 

     }else{ 

      LOGGER.info("25 or Under"); 

     } 
    } 

どのように私は正しいLogbackログ文が呼び出されていることを確認するためにテストすることができます?

私のテストでは、loggerを模擬して呼び出されたことを確認しようとしましたが、これは機能しませんでしたか?

現在のテストの試み:

@Test 
    public void testShowOutputOfIdentifications() throws ParseException{ 

    int age = 10; 

    Logger LOGGER_mock = mock(Logger.class); 

    //call method under test 
    showOutputOfIdentifications(age); 

    verify(LOGGER_mock).info("25 or under"); 


} 

現在の失敗テスト出力:

Wanted but not invoked: 
logger.info(
    "25 or under " 
); 

Actually, there were zero interactions with this mock. 
+2

テスト対象のクラスには、おそらくスタティックロガーLOGGERが使用されています。あなたはそのロガーとしてモックを注入する必要があります。別のロガーを作成しても、それは呼び出されません。 – Fildor

+0

ありがとう、私は静的なロガーを表示する元のメソッドを編集しました# – java123999

+0

ポイントは:あなたが**制御する必要があります**あなたの "テスト中のコード"が使用しているオブジェクト。あなたのためにオブジェクトを作成するファクトリがあれば、そのオブジェクトはテスト中のクラス内で割り当てられます。あなたはコントロールがありません。 – GhostCat

答えて

2

あなたがあなた自身のアペンダを追加して、ログメッセージは、そのように書かれていたことを主張、Programmatically configure LogBack appenderを見ることができました。このような

何か:

// create the mock appender 
Appender mockedAppender = Mockito.mock(Appender.class); 

// inject it 
((ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)).addAppender(mockedAppender); 

// run your test 
LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME).error("Test msg"); 

// verify using ArgumentCaptor 
ArgumentCaptor<Appender> argumentCaptor = ArgumentCaptor.forClass(Appender.class); 
Mockito.verify(mockedAppender).doAppend(argumentCaptor.capture()); 

// assert against argumentCaptor.getAllValues() 
Assert.assertEquals(1, argumentCaptor.getAllValues().size()); 
Assert.assertEquals("Test msg", ((LoggingEvent)argumentCaptor.getAllValues().get(0)).getMessage()); 

// remove the mock appender from static context 
((Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)).detachAppender(mockedAppender); 
+0

本当にありがとう、私は実際のロガーまたはモックのためのアペンダーを書いていますか? – java123999

+0

前の投稿では、テストするクラスのモックを**注射するように言った。あなたが魔法を使わないと、それを使用させることはできません... –

+0

ありがとう、このコード例を示してくださいできますか? – java123999

0

私はアペンダをモックするGroovyとSpockを使用して、これを書いています。

マイlogback-のtest.xmlファイルは

<configuration debug="true"> 
<statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener"/> 
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <encoder> 
     <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 
    </encoder> 
</appender> 

<appender name="JSON" class="ch.qos.logback.core.ConsoleAppender"> 
    <encoder> 
     <pattern>%msg%n</pattern> 
    </encoder> 
</appender> 

<logger name="clicks" level="INFO" additivity="false"> 
    <appender-ref ref="JSON"/> 
</logger> 
<logger name="com.carsnip" level="DEBUG"/> 

<root level="INFO"> 
    <appender-ref ref="STDOUT"/> 
</root> 

のように見え、私のテストが含まれています

class LogTest extends Specification{ 
    def "should log"() { 
     given: 
     Logger root = (Logger) 
     LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); 
     Appender rootMockAppender = Mock() 
     root.addAppender(rootMockAppender); 
     Logger click = (Logger) LoggerFactory.getLogger("clicks"); 
     Appender clickMockAppender = Mock() 
     click.addAppender(clickMockAppender); 

     when: 
     click.info("HEYYYYY") 

    then: 
     0 * rootMockAppender.doAppend(_) 
     1 * clickMockAppender.doAppend(_) 
    } 
} 

がこれは加法属性をチェックするために書かれている、ROOTロガーように、階層内で上位にあるものは、別の場所に移動するクリックロガーからログを取得しません。

関連する問題