2016-11-28 6 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. Помогает ли это решить вашу проблему? Если это сработает, я могу преобразовать этот комментарий в ответ, чтобы вы могли его принять. Если нет, вы можете использовать assertEquals в logMessage. –

ответ

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) является перехваченным (вы можете написать один тест, который бросает исключение во время выполнения, которое можно было бы ожидать, чтобы ударить TestCase, а второй тест, который бросает FeatureException ... которые, очевидно, не следует делать это на тестовом примере).