2016-06-30 6 views
1

Ниже приведен метод, который я пытаюсь написать тест Junit для:Проверка того, что статус журнала журнала журнала был вызван с помощью Junit?

Метода Я хочу испытание:

//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 и убедиться, что он был вызван, однако это не сработало?

Current Test Покушение:

@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

Вы можете добавить свой собственный Appender и утверждают, что сообщение журнала был написан таким образом, см 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

спасибо, поэтому я пишу appender для фактического регистратора или макета? – java123999

+0

В прецедентном посте я сказал вам, чтобы ** вставить ** макет в классе для тестирования. Если у вас нет магии, это позволит использовать ее ... –

+0

Спасибо, пожалуйста, покажите пример кода этого? – java123999

0

Я написал это с помощью Groovy и Spock для имитации appenders.

Мой файл 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 регистратор , который выше в иерархии, не забирает журналы из нашего регистратора кликов, который собирается в другом месте.

Смежные вопросы