Тестване на обратно извикване с Mockito

1. Общ преглед

В този кратък урок ще се съсредоточим върху това как да тестваме обратно извикване с помощта на популярната рамка за тестване Mockito.

Ще проучим две решения, първо като използваме ArgumentCaptor, а след това интуитивния метод doAnswer () .

За да научите повече за тестването добре с Mockito, разгледайте нашата серия Mockito тук.

2. Въведение в обратните обаждания

Обратното обаждане е парче код, което се предава като аргумент на метод, който се очаква да извика обратно (изпълни) аргумента в даден момент .

Това изпълнение може да бъде незабавно, както при синхронно обратно извикване, но по-често може да се случи по-късно, както при асинхронен обратен извикване

Често срещан сценарий за използването на обратни обаждания е по време на взаимодействие на услугата, когато трябва да обработим отговора от повикване за услуга .

В този урок ще използваме сервизния интерфейс, показан по-долу, като сътрудник в тестови случаи:

public interface Service { void doAction(String request, Callback callback); }

В аргумента Callback предаваме клас, който ще обработва отговора, използвайки метода reply (T response) :

public interface Callback { void reply(T response); } 

2.1. Лесна услуга

Също така ще използваме ясен пример за услуга, за да покажем как да преминем и да извикаме обратно обаждане :

public void doAction() { service.doAction("our-request", new Callback() { @Override public void reply(Response response) { handleResponse(response); } }); } 

Методът handleResponse проверява дали отговорът е валиден, преди да добави някои данни към обекта Response :

private void handleResponse(Response response) { if (response.isValid()) { response.setData(new Data("Successful data response")); } }

За по-голяма яснота избрахме да не използваме израза Java Lamda, но повикването service.doAction може да бъде написано и по-кратко :

service.doAction("our-request", response -> handleResponse(response)); 

За да научите повече за ламбда изразите, погледнете тук.

3. Използване на ArgumentCaptor

Сега нека разгледаме как използваме Mockito, за да вземем обекта Callback с помощта на ArgumentCaptor :

@Test public void givenServiceWithValidResponse_whenCallbackReceived_thenProcessed() { ActionHandler handler = new ActionHandler(service); handler.doAction(); verify(service).doAction(anyString(), callbackCaptor.capture()); Callback callback = callbackCaptor.getValue(); Response response = new Response(); callback.reply(response); String expectedMessage = "Successful data response"; Data data = response.getData(); assertEquals( "Should receive a successful message: ", expectedMessage, data.getMessage()); }

В този пример първо създаваме ActionHandler, преди да извикаме метода doAction на този манипулатор. Това е просто обвивка към извикването на метода ни за Simple Service doAction, където извикваме обратното ни обаждане.

След това проверяваме дали doAction е бил извикан в нашия фиктивен екземпляр на услугата, като е предал anyString () като първи аргумент и callbackCaptor.capture () като втори, където улавяме обекта Callback . След това методът getValue () може да се използва за връщане на уловената стойност на аргумента.

Сега, когато имаме обекта за обратно извикване , ние създаваме обект на отговор, който е валиден по подразбиране, преди да извикаме директно метода за отговор и да твърдим, че данните за отговора имат правилната стойност .

4. Използване на doAnswer () Метод

Сега ще разгледаме често срещано решение за методите за затихване, които имат обратно извикване, използвайки обекта на Mockito Answer и метода doAnswer , за да заглушат метода void doAction:

@Test public void givenServiceWithInvalidResponse_whenCallbackReceived_thenNotProcessed() { Response response = new Response(); response.setIsValid(false); doAnswer((Answer) invocation -> { Callback callback = invocation.getArgument(1); callback.reply(response); Data data = response.getData(); assertNull("No data in invalid response: ", data); return null; }).when(service) .doAction(anyString(), any(Callback.class)); ActionHandler handler = new ActionHandler(service); handler.doAction(); } 

И във втория ни пример първо създаваме невалиден обект Response, който ще бъде използван по-късно в теста.

След това настройваме Answer на нашата фиктивна услуга, така че когато се извика doAction , ние прихващаме извикването и грабваме аргументите на метода, като използваме invocation.getArgument (1), за да получим аргумента Callback .

Последната стъпка е да се създаде ActionHandler и да се извика doAction, което води до извикване на отговора .

За да научите повече за зашеметяващите кухини, погледнете тук.

3. Заключение

В тази кратка статия разгледахме два различни начина за тестване на обратните обаждания при тестване с Mockito.

Както винаги, примерите са налични в този проект на GitHub.