Mocking Logger и LoggerFactory с PowerMock и Mockito

У меня есть следующий регистратор, который я хочу высмеять, но чтобы проверить, что записи журнала вызываются, а не для содержания.

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));

    ...
}

Я хотел бы знать:

  1. Могу ли я смоделировать статический LoggerFactory.getLogger () , чтобы он работал для любого класса?
  2. Я могу только похоже, запускается , когда (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 делает это, но оба соглашаются, что проверка не выполняется.

56
задан Adrian Jałoszewski 12 September 2016 в 13:25
поделиться