Подигравка на частни методи с помощта на PowerMock

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

Едно от предизвикателствата на модулното тестване е подиграването с частни методи.

В този урок ще научим как можем да постигнем това с помощта на библиотеката PowerMock - която се поддържа от JUnit и TestNG.

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

Прави това, като разчита на манипулиране на байт кодове и изцяло отделен loadloader.

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

Първо, нека добавим необходимите зависимости, за да използваме PowerMock с Mockito и JUnit в нашия pom.xml :

 org.powermock powermock-module-junit4 1.7.3 test   org.powermock powermock-api-mockito2 1.7.3 test 

Най-новите версии могат да бъдат проверени тук и тук.

3. Пример

Нека започнем с пример за LuckyNumberGenerator. Този клас има един публичен метод за генериране на щастливо число:

public int getLuckyNumber(String name) { saveIntoDatabase(name); if (name == null) { return getDefaultLuckyNumber(); } return getComputedLuckyNumber(name.length()); }

4. Вариации в подигравка с частни методи

За изчерпателно модулно тестване на метода ще трябва да се подиграваме с частни методи.

4.1. Метод без аргументи, но с възвръщаема стойност

Като прост пример, нека се подиграем с поведението на частен метод без аргументи и го принудим да върне желаната стойност:

LuckyNumberGenerator mock = spy(new LuckyNumberGenerator()); when(mock, "getDefaultLuckyNumber").thenReturn(300); 

В този случай се подиграваме с частния метод getDefaultLuckyNumber и го караме да връща стойност 300.

4.2. Метод с аргумент и възвръщаема стойност

След това нека се подиграем с поведението на частен метод с аргумент и го принудим да върне желаната стойност:

LuckyNumberGenerator mock = spy(new LuckyNumberGenerator()); doReturn(1).when(mock, "getComputedLuckyNumber", ArgumentMatchers.anyInt()); 

В този случай се подиграваме с частния метод и го караме да връща 1.

Забележете, че не ни интересува входният аргумент и използваме ArgumentMatchers.anyInt () като заместващ знак.

4.3. Проверка на извикване на метод

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

LuckyNumberGenerator mock = spy(new LuckyNumberGenerator()); int result = mock.getLuckyNumber("Tyranosorous"); verifyPrivate(mock).invoke("saveIntoDatabase", ArgumentMatchers.anyString()); 

5. Предупредителна дума

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

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

Подигравателните техники трябва да се прилагат към външните зависимости на класа, а не към самия клас.

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

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

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

Изходният код на този урок може да бъде намерен в GitHub.