Mockito не может вызвать экземпляр Logger - «Фактически, с этим макетом не было никаких взаимодействий». Разыскивается, но не используется

Мои занятия:

      public class Util {
    private static final CustomLogger LOGGER = new CustomLogger(Util.class);

    public static void commitToDB() {
        try {
            CommitToDB();
        } catch (SQLException sqlException) {
             LOGGER.error("Exception in DB Commit", sqlException.getMessage(), sqlException);
        }
    }
}

Мой класс модульного теста:

      @RunWith(PowerMockRunner.class)
@PrepareForTest({
        CustomLogger.class
})
public class UtilTest {
    @Mock
    private Util util;

    @Mock
    private CustomLogger CustomLogger;

    public void verifyFailedCommitRecords() throws SQLException {
        SQLException sqlException = new SQLException("Exception in DB Commit");
        doThrow(sqlException).when(protectedConn).commit();
        CustomLogger logger = PowerMockito.mock(CustomLogger.class);
        Util.CommitToDB();
        verify(logger, times(1)).error("Exception in DB Commit", sqlException.getMessage(), sqlException);
    }
}

Я получаю сообщение об ошибке: «На самом деле, с этим макетом не было никакого взаимодействия». Разыскивается, но не вызывается:

PS: Util.commitToDB вызывает внутренний класс protectedConnection, который выдает исключение SQLexception.

1 ответ

Добавление следующей строки в тестовый метод решает проблему:

       Whitebox.setInternalState(Util.class , "LOGGER" , logger);

После отладки выяснилось, что экземпляр Logger в классе Util и в классе UtilTest были разными.

Причина, по которой макет выдавал ошибку «Разыскивается, но не вызван», заключается в том, что экземпляр регистратора, вызывающий метод, и тот, который использовался для проверки в модульном тесте, были разными.

Другие вопросы по тегам