Mock Static Method с помощта на JMockit

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

Някои популярни подигравателни библиотеки като Mockito и Easymock генерират макети, като се възползват от модела на класа, базиран на наследство на Java. EasyMock реализира интерфейс по време на изпълнение, докато Mockito наследява от целевия клас, за да създаде подигравателен мъниче.

Нито един от подходите не работи добре за статични методи, тъй като статичните методи са свързани с клас и не могат да бъдат заменени. Въпреки това JMockit предоставя статични методи за подигравки.

В този урок ще разгледаме някои от тези функции.

За въведение в JMockit, моля, вижте предишната ни статия.

2. Зависимости на Maven

Нека започнем с зависимостите на Maven:

 org.jmockit jmockit 1.24 test 

Можете да намерите най-новите версии на тези библиотеки в Maven Central.

3. Статичен метод, извикан от нестатичен метод

Първо, нека разгледаме случай, когато имаме клас с нестатичен метод, който вътрешно зависи от статичния метод :

public class AppManager { public boolean managerResponse(String question) { return AppManager.isResponsePositive(question); } public static boolean isResponsePositive(String value) { if (value == null) { return false; } int length = value.length(); int randomNumber = randomNumber(); return length == randomNumber ? true : false; } private static int randomNumber() { return new Random().nextInt(7); } }

Сега искаме да тестваме метода managerResponse (). Тъй като връщаната му стойност зависи от друг метод, трябва да се подиграем с метода isResponsePositive () .

Ние можем да се подиграват на този метод статично използване JMockit на анонимен клас mockit.MockUp.MockUp ( където T ще бъде името на класа ) и @Mock анотация:

@Test public void givenAppManager_whenStaticMethodCalled_thenValidateExpectedResponse() { new MockUp() { @Mock public boolean isResponsePositive(String value) { return false; } }; assertFalse(appManager.managerResponse("Some string...")); }

Тук се подиграваме с isResponsePositive () с върната стойност, която бихме искали да използваме за теста. Следователно, проверка на очаквания резултат с помощта на помощната програма Assertions , налична в Junit-5.

4. Тествайте частен статичен метод

В няколко случая други методи използват частни статични методи от класа:

private static Integer stringToInteger(String num) { return Integer.parseInt(num); }

За да тестваме такъв метод, ще трябва да се подиграваме с частния статичен метод . Можем да използваме помощния метод Deencapsulation.invoke () , предоставен от JMockit :

@Test public void givenAppManager_whenPrivateStaticMethod_thenValidateExpectedResponse() { int response = Deencapsulation.invoke(AppManager.class, "stringToInteger", "110"); assertEquals(110, response); }

Както подсказва името, целта му е да декапсулира състоянието на даден обект. По този начин JMockit опростява методите за тестване, които не биха могли да бъдат тествани по друг начин.

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

В тази статия видяхме как статичните методи могат да се подиграват с помощта на JMockit . За по-задълбочен поглед върху някои от разширените функции на JMockit, разгледайте нашата статия за разширено използване на JMockit.

Както обикновено, пълният изходен код за този урок е достъпен в GitHub.