Да, вы правильно прочитали: ” Издевательский регистратор в Java “. Это может показаться очень странным, когда вы видите это в первый раз, но есть некоторые конкретные случаи, в которых единственным способом модульного тестирования некоторых частей вашего приложения является проверка того, были ли зарегистрированы некоторые конкретные сообщения или нет.
Например, предположим, что вашему приложению необходимо выполнить асинхронный вызов какой-либо другой веб-службы. Затем у вас есть отдельные потоки для выполнения этого вызова. Для основного потока не имеет значения, был ли вызов службы успешным или нет, потому что он не будет ждать ответа (в противном случае он был бы синхронным, верно?). Предположим, что эта часть вашего приложения просто вызовет службу и после этого только зарегистрирует, был ли вызов успешным или нет (излишне говорить, что в таком случае вам нужен инструмент мониторинга, чтобы знать, когда дела идут плохо в производстве).
Теперь вам нужно создать тестовый пример JUnit, чтобы охватить эти сценарии. Если вы загуглите это, вы найдете некоторых людей, использующих PowerMock для этого, но представьте, что вы уже используете Мокито и, по какой-то причине, вы хотите сделать это с помощью Mockito только.
В этом посте я предполагаю, что вы уже знакомы с Mockito , поэтому я сосредоточусь только на части ” mocking logger “. Вы можете найти множество руководств Mockito в Интернете, если хотите изучить его.
Хорошо. Один из способов добиться этого – смоделировать Appender вашего объекта Logger и использовать Мокито ‘s ArgumentCaptor для записи всех событий протоколирования в вашем тестовом примере:
@Mock private Appender mockedAppender; @Captor private ArgumentCaptorloggingEventCaptor;
Затем вы должны убедиться, что издевались Приложение добавляется в корневой каталог Регистратор перед выполнением тестов:
@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”