Как заставить JUnit ловить логи и терпеть неудачу
Я широко использую slf4j в своем приложении. Из соображений стабильности существуют сценарии, в которых мой код будет корректно обрабатывать состояние ошибки, просто регистрировать его как ошибку и двигаться дальше.
Тем не менее, я хочу написать тесты, которые демонстрируют, что для данного ввода моя SUT не генерирует такие журналы ошибок.
Например, мой код часто выглядит так:
public class MyClass {
private static final Logger LOG = LoggerFactory.getLogger(MyClass.class);
// snip
public void someMethod(DTO input) {
try {
// snip
} catch (SomeException e) {
LOG.error("Code failed here!", e);
// recover gracefully
}
}
}
Я хочу, чтобы в моем тестовом случае поймать что-то вроде
Mockito.verify(LOG.error(Mockito.anyString(), Mockito.any(SomeException.class), times(0));
Однако из-за того, как я генерирую LOG
объект - используя slf4j LoggerFactory
API, трудно издеваться LOG
объект. То, что я действительно хочу сделать, это иметь другую реализацию тестирования slf4j (я использую logback в работе), к которой имеют доступ JUnit и Mockito. Как я могу это сделать?
Я использую JUnit 4.11, Mockito 1.9.5 и Jukito 1.3. Я бы предпочел не использовать PowerMock, поскольку он несовместим с Jukito.