Мокетните методи на Mockito

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

Този урок илюстрира различни приложения на стандартните статични фиктивни методи на API на Mockito .

Както и при останалите членове се фокусира върху рамката Mockito (като Mockito Потвърдете или Mockito Когато / След това), на MyList класа показани по-долу ще бъде използван като сътрудника да се подигра с тестови случаи:

public class MyList extends AbstractList { @Override public String get(int index) { return null; } @Override public int size() { return 1; } }

2. Обикновено подигравка

Най-простият претоварен вариант на метода на макет е този с един параметър за класа, който трябва да се подиграва:

public static  T mock(Class classToMock)

Ще използваме този метод, за да се подиграем с клас и да зададем очакване:

MyList listMock = mock(MyList.class); when(listMock.add(anyString())).thenReturn(false);

След това изпълнете метод по макет:

boolean added = listMock.add(randomAlphabetic(6));

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

verify(listMock).add(anyString()); assertThat(added, is(false));

3. Подигравка с името на Mock

В този раздел ще разгледаме друг вариант на макетния метод, който е снабден с аргумент, указващ името на макета:

public static  T mock(Class classToMock, String name)

Най-общо казано, името на макет няма нищо общо с работещия код, но може да бъде полезно, когато става въпрос за отстраняване на грешки, където името на макета се използва за проследяване на грешки при проверка.

За да сме сигурни, че предоставеното име на макет е включено в съобщението за изключение, хвърлено от неуспешна проверка, ще разчитаме на изпълнение на JUnit на интерфейса TestRul e, наречено ExpectedException , и ще го включим в тестов клас:

@Rule public ExpectedException thrown = ExpectedException.none();

Това правило ще се използва за обработка на изключения, изхвърлени от тестови методи.

В следния код, ние създаваме макет за MyList класа и го наречете myMock :

MyList listMock = mock(MyList.class, "myMock");

След това задайте очакване за метод на макета и го изпълнете:

when(listMock.add(anyString())).thenReturn(false); listMock.add(randomAlphabetic(6));

Ще създадем умишлено неуспешна проверка, която трябва да изведе изключение със съобщението, съдържащо информация за макета. За да го направите, първо трябва да се зададат очакванията за изключението:

thrown.expect(TooLittleActualInvocations.class); thrown.expectMessage(containsString("myMock.add"));

Следващата проверка трябва да се провали и да изведе изключение, съответстващо на очакваното:

verify(listMock, times(2)).add(anyString());

Ето съобщението на хвърленото изключение:

org.mockito.exceptions.verification.TooLittleActualInvocations: myMock.add(); Wanted 2 times: at com.baeldung.mockito.MockitoMockTest .whenUsingMockWithName_thenCorrect(MockitoMockTest.java:...) but was 1 time: at com.baeldung.mockito.MockitoMockTest .whenUsingMockWithName_thenCorrect(MockitoMockTest.java:...)

Както виждаме, името на макета е включено в съобщението за изключение, което ще бъде полезно за намиране на точката на отказ в случай на неуспешна проверка.

4. Подигравка с отговор

Тук ще демонстрираме използването на макет вариант, в който стратегията за макет отговори на взаимодействие е конфигурирана по време на създаването. Подписът на този фалшив метод в документацията на Mockito изглежда по следния начин:

public static  T mock(Class classToMock, Answer defaultAnswer)

Нека започнем с дефиницията на изпълнение на интерфейса за отговор :

class CustomAnswer implements Answer { @Override public Boolean answer(InvocationOnMock invocation) throws Throwable { return false; } }

Класът CustomAnswer по-горе се използва за генериране на макет:

MyList listMock = mock(MyList.class, new CustomAnswer());

Ако не зададем очакване за метод , ще влезе в действие отговорът по подразбиране, който е конфигуриран от типа CustomAnswer . За да го докажем, ще прескочим стъпката за настройка на очакванията и ще преминем към изпълнението на метода:

boolean added = listMock.add(randomAlphabetic(6));

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

verify(listMock).add(anyString()); assertThat(added, is(false));

5. Подигравка с MockSettings

Последният макет метод, който е разгледан в тази статия, е вариантът с параметър от типа MockSettings . Този претоварен метод се използва за осигуряване на нестандартен макет.

Има няколко персонализирани настройки, които се поддържат от методи на интерфейса MockSettings , като например регистриране на слушател за извиквания на метода в текущия макет с invocationListeners , конфигуриране на сериализация с serializable , определяне на екземпляра, който да се шпионира с spiedInstance , конфигуриране на Mockito да опита да използва конструктор при инстанциране на макет с useConstructor и някои други.

За удобство ще използваме отново класа CustomAnswer, въведен в предишния раздел, за да създадем изпълнение на MockSettings, което дефинира отговор по подразбиране.

Обект MockSettings се създава чрез фабричен метод, както следва:

MockSettings customSettings = withSettings().defaultAnswer(new CustomAnswer());

Този обект за настройка ще бъде използван при създаването на нов макет:

MyList listMock = mock(MyList.class, customSettings);

Подобно на предходния раздел, ние ще се позове на добавка метода на MyList инстанция и се уверете, че макет метод с MockSettings аргумент работи, тъй като има за цел да с помощта на следния кодов фрагмент:

boolean added = listMock.add(randomAlphabetic(6)); verify(listMock).add(anyString()); assertThat(added, is(false));

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

Този урок е покрита с макет метода на Mockito в детайли. Изпълнението на тези примери и кодови фрагменти може да бъде намерено в проект на GitHub.