У меня есть следующий Logger, который я хочу издеваться, но для проверки записей журнала вызываются, а не для содержимого.
private static Logger logger =
LoggerFactory.getLogger(GoodbyeController.class);
Я хочу издеваться над ЛЮБЫМ классом, который используется для LoggerFactory.getLogger(), но я не мог понять, как это сделать. Вот что у меня получилось до сих пор:
@Before
public void performBeforeEachTest() {
PowerMockito.mockStatic(LoggerFactory.class);
when(LoggerFactory.getLogger(GoodbyeController.class)).
thenReturn(loggerMock);
when(loggerMock.isDebugEnabled()).thenReturn(true);
doNothing().when(loggerMock).error(any(String.class));
...
}
Я бы хотел знать:
- Могу ли я издеваться над статическим
LoggerFactory.getLogger()
для работы с любым классом? - Кажется, я могу запустить только
when(loggerMock.isDebugEnabled()).thenReturn(true);
в@Before
, и поэтому я не могу изменить характеристики для каждого метода. Есть ли способ обойти это?
Изменить результаты:
Я думал, что уже пробовал это, и это не сработало:
when(LoggerFactory.getLogger(any(Class.class))).thenReturn(loggerMock);
Но спасибо, как то заработало.
Однако я пробовал бесчисленное количество вариантов:
when(loggerMock.isDebugEnabled()).thenReturn(true);
Я не могу заставить loggerMock изменить свое поведение за пределами @Before
, но это происходит только с Coburtura. С Clover покрытие показывает 100%, но в любом случае есть проблема.
У меня есть этот простой класс:
public ExampleService{
private static final Logger logger =
LoggerFactory.getLogger(ExampleService.class);
public String getMessage() {
if(logger.isDebugEnabled()){
logger.debug("isDebugEnabled");
logger.debug("isDebugEnabled");
}
return "Hello world!";
}
...
}
Тогда у меня есть этот тест:
@RunWith(PowerMockRunner.class)
@PrepareForTest({LoggerFactory.class})
public class ExampleServiceTests {
@Mock
private Logger loggerMock;
private ExampleServiceservice = new ExampleService();
@Before
public void performBeforeEachTest() {
PowerMockito.mockStatic(LoggerFactory.class);
when(LoggerFactory.getLogger(any(Class.class))).
thenReturn(loggerMock);
//PowerMockito.verifyStatic(); // fails
}
@Test
public void testIsDebugEnabled_True() throws Exception {
when(loggerMock.isDebugEnabled()).thenReturn(true);
doNothing().when(loggerMock).debug(any(String.class));
assertThat(service.getMessage(), is("Hello null: 0"));
//verify(loggerMock, atLeast(1)).isDebugEnabled(); // fails
}
@Test
public void testIsDebugEnabled_False() throws Exception {
when(loggerMock.isDebugEnabled()).thenReturn(false);
doNothing().when(loggerMock).debug(any(String.class));
assertThat(service.getMessage(), is("Hello null: 0"));
//verify(loggerMock, atLeast(1)).isDebugEnabled(); // fails
}
}
В клевере показываю 100% покрытие блока if(logger.isDebugEnabled()){
. Но если я попытаюсь проверить loggerMock
:
verify(loggerMock, atLeast(1)).isDebugEnabled();
Я получаю ноль взаимодействий. Я также пробовал PowerMockito.verifyStatic()
; в @Before
, но это также не имеет взаимодействий.
Просто кажется странным, что Cobertura показывает if(logger.isDebugEnabled()){
как не завершенный на 100%, а Clover это делает, но оба соглашаются, что проверка не удалась.