Рубрики
Без рубрики

Издевательский регистратор на Java с помощью Mockito

Да, вы правильно прочитали: “Издевательский регистратор в Java”. Это может показаться очень странным, когда вы видите это f… Помеченный как java, тестирование.

Да, вы правильно прочитали: ” Издевательский регистратор в Java “. Это может показаться очень странным, когда вы видите это в первый раз, но есть некоторые конкретные случаи, в которых единственным способом модульного тестирования некоторых частей вашего приложения является проверка того, были ли зарегистрированы некоторые конкретные сообщения или нет.

Например, предположим, что вашему приложению необходимо выполнить асинхронный вызов какой-либо другой веб-службы. Затем у вас есть отдельные потоки для выполнения этого вызова. Для основного потока не имеет значения, был ли вызов службы успешным или нет, потому что он не будет ждать ответа (в противном случае он был бы синхронным, верно?). Предположим, что эта часть вашего приложения просто вызовет службу и после этого только зарегистрирует, был ли вызов успешным или нет (излишне говорить, что в таком случае вам нужен инструмент мониторинга, чтобы знать, когда дела идут плохо в производстве).

Теперь вам нужно создать тестовый пример JUnit, чтобы охватить эти сценарии. Если вы загуглите это, вы найдете некоторых людей, использующих PowerMock для этого, но представьте, что вы уже используете Мокито и, по какой-то причине, вы хотите сделать это с помощью Mockito только.

В этом посте я предполагаю, что вы уже знакомы с Mockito , поэтому я сосредоточусь только на части ” mocking logger “. Вы можете найти множество руководств Mockito в Интернете, если хотите изучить его.

Хорошо. Один из способов добиться этого – смоделировать Appender вашего объекта Logger и использовать Мокито ‘s ArgumentCaptor для записи всех событий протоколирования в вашем тестовом примере:

    @Mock
    private Appender mockedAppender;

    @Captor
    private ArgumentCaptor loggingEventCaptor;

Затем вы должны убедиться, что издевались Приложение добавляется в корневой каталог Регистратор перед выполнением тестов:

    @Before
    public void setup() {
        Logger root = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
        root.addAppender(mockedAppender);
        root.setLevel(Level.INFO);
    }

После этого вы готовы вызвать тестируемый класс и выполнить утверждения для зарегистрированных сообщений:

    @Test
    public void testSuccessCall() throws Exception {
        // mock all required response objects in here

        [...]

        // this is the call to the service being tested
        myService.execute(createRequestForSuccessResponse());

        // check how many times the ArgumentCaptor was called
        verify(mockAppender, times(1)).doAppend(loggingEventCaptor.capture());
        // get the reference to the LoggingEvent you want to inspect
        LoggingEvent loggingEvent = loggingEventCaptor.getAllValues().get(0);
        // check the logged message
        assertEquals("Webservice was successfully called", loggingEvent.getMessage());
        // check the log level
        assertEquals(Level.INFO, loggingEvent.getLevel());
    }

Я надеюсь, что это может быть в конечном итоге полезно, когда вы столкнетесь с таким конкретным сценарием! 😉

Оригинал: “https://dev.to/claudiohigashi/mocking-logger-in-java-with-mockito-51k8”