different types matchers provided mockito
како отворити 7зип датотеке на мац-у
Увод у различите врсте подударања у Моцкиту.
Ругачи и шпијуни у Моцкиту су детаљно објашњени у претходном детаљном водичу Моцкито серија тренинга .
Шта су Матцхерс?
Подударања су попут регуларног израза или џокерских знакова, где уместо одређеног улаза (и / или излаза), одредите опсег / тип уноса / излаза на основу којег стуб-ови / шпијуни могу да се одморе и позиви на стуб-ове могу бити верификовани.
Сви Моцкито мечеви су део „ Моцкито ’ статичка класа.
Подударања су моћан алат који омогућава скраћени начин постављања квара, као и верификацију позива на карикама, помињањем уноса аргумената као генеричких типова до одређених вредности, у зависности од случаја употребе или сценарија.
Шта ћете научити:
Врсте шибица у Моцкиту
У Моцкито-у постоје углавном 2 врсте подударања или у погледу употребе, подударања се могу користити за следеће две категорије:
- Подударање аргумената током постављања Стуб-а
- Верификациони подударачи за верификацију стварних позива на клице
За обе врсте подударања, тј. Аргумент и верификацију, Моцкито нуди огроман скуп подударања (клик овде да бисте добили потпуну листу подударника).
Аргумент Матцхерс
Наведени су најчешће коришћени:
За све доле, размотримо тестирање ИнтегерЛист-а:
final List mockedIntList = mock(ArrayList.class);
# 1) било који () - Прихвата било који објекат (укључујући нулл).
when (mockedIntList.get( any ())).thenReturn(3);
#два) било који (час учења Јава језика) -
Пример : било који (ЦлассУндерТест.цласс) - Ово је специфичнија варијанта било којег () и прихватиће само објекте типа класе који су поменути као параметар предлошка.
when (mockedIntList.get( any (Integer.class))).thenReturn(3);
# 3) аниБоолеан (), аниБите (), аниИнт (), аниСтринг (), аниДоубле (), аниФлоат (), аниЛист () и још много тога - Сви ови прихватају било који објекат одговарајућег типа података, као и нулл вредности.
when (mockedIntList.get( any Int())).thenReturn(3);
# 4) Конкретни аргументи - У случајевима када су стварни аргументи познати унапред, увек се препоручује њихова употреба јер пружају више поверења у односу на генеричке типове аргумената.
Пример:
when(mockedIntList.get(1)).thenReturn(3);
Верификационе утакмице
Постоје нека специјализована подударања која могу да очекују / потврде ствари попут бр. позивања на лаж.
За сва доња подударања, размотримо исту листу примера коју смо раније користили.
final List mockedIntList = mock(ArrayList.class);
# 1) Исмевање позива
(и) Једноставно позивање у Моцк-у проверава да ли је позвани метод позван / комунициран или не подешавањем величине спрдње листе на 5.
//arrange when(mockedList.size()).thenReturn(5); // act int size = mockedList.size(); // assert verify(mockedList).size();
(ии) Одређени број интеракција са исмеваном методом потврђује број не. пута се очекивало да се изругује.
//arrange when(mockedList.size()).thenReturn(5); // act int size = mockedList.size(); // assert verify(mockedList, times(1)).size();
Да бисте верификовали 0 интеракција, једноставно промените вредност са 1 на 0 као аргумент за подударање тимес ().
//arrange when(mockedList.size()).thenReturn(5); // act int size = mockedList.size(); // assert verify(mockedList, times(0)).size();
У случају квара, враћа следеће изузетке:
до) Када су очекивани позиви мањи од стварних позива:
Пример: Хтео је 2 пута, али се позивао 3 пута, а затим се Моцкито враћа - „ провера.ТооМаниАцтуалИнвоцатионс '
Пример кода:
final List mockedIntList = mock(ArrayList.class); // Arrange when(mockedIntList.get(anyInt())).thenReturn(3); // Act int response = mockedIntList.get(5); response = mockedIntList.get(3); response = mockedIntList.get(100); // Assert verify(mockedIntList, times(2)).get(anyInt());
б) Када су очекивани позиви већи од стварних:
Пример: Хтео је 2 пута, али се једном позивао, а затим се Моцкито враћа - „ провера.ТооЛиттлеАцтуалИнвоцатионс '
final List mockedIntList = mock(ArrayList.class); // Arrange when(mockedIntList.get(anyInt())).thenReturn(3); // Act int response = mockedIntList.get(5); response = mockedIntList.get(3); response = mockedIntList.get(100); // Assert verify(mockedIntList, times(4)).get(anyInt());
(иии) Нема интеракције са одређеном методом исмеваног објекта.
претварање цхар у инт ц ++
final List mockedIntList = mock(ArrayList.class); // Arrange when(mockedIntList.get(anyInt())).thenReturn(3); // Act int response = mockedIntList.get(5); // Assert verify(mockedIntList, never()).size();
(ив) Проверите редослед исмеваних интеракција - Ово је посебно корисно када желите да осигурате редослед којим су позване методе на исмеваним објектима.
Пример: База података попут операција где би тест требало да верификује редослед ажурирања базе података.
Да то илуструјемо Примером - Наставимо са истим списком примера.
Сада претпоставимо да је редослед позива метода пописа био у низу, тј. Гет (5), сизе (), гет (2). Дакле, редослед верификације такође треба да буде исти.
// Arrange when(mockedIntList.get(anyInt())).thenReturn(3); when(mockedIntList.size()).thenReturn(100); InOrder mockInvocationSequence = Mockito.inOrder(mockedIntList); // Act int response = mockedIntList.get(5); int size = mockedIntList.size(); response = mockedIntList.get(2); // Assert mockInvocationSequence.verify(mockedIntList, times(1)).get(anyInt()); mockInvocationSequence.verify(mockedIntList).size(); mockInvocationSequence.verify(mockedIntList, times(1)).get(anyInt());
У случају погрешне секвенце верификације, Моцкито доноси изузетак - тј. провера.ВерифицатионИнОрдерФаилуре ”.
Дакле, у горњем примеру, ако променим редослед верификације заменом последња 2 реда, почећу да добијам изузетак ВерифицатионИнОрдерФаилуре.
// Arrange when(mockedIntList.get(anyInt())).thenReturn(3); when(mockedIntList.size()).thenReturn(100); InOrder mockInvocationSequence = Mockito.inOrder(mockedIntList); // Act int response = mockedIntList.get(5); int size = mockedIntList.size(); response = mockedIntList.get(2); // Assert mockInvocationSequence.verify(mockedIntList, times(1)).get(anyInt()); mockInvocationSequence.verify(mockedIntList, times(1)).get(anyInt()); mockInvocationSequence.verify(mockedIntList).size();
(в) Проверите да ли је до интеракције дошло најмање / најмање пута.
(до) барем:
Пример: атлеаст (3) - проверава да ли је исмевани објекат три пута позиван / комуницирао са најмање три пута током теста. Дакле, било која интеракција 3 или већа од 3 требало би да верификацију учини успешном.
// Arrange when(mockedIntList.get(anyInt())).thenReturn(3); // Act int response = mockedIntList.get(5); response = mockedIntList.get(2); // Assert verify(mockedIntList, atLeast(2)).get(anyInt());
У случају грешака, тј. Када се стварни позиви не подударају, избацује се исти изузетак као и код подударања тимес (), тј. верифи.ТооЛиттлеАцтуалИнвоцатионс ”
(б) Највише:
Пример: атмост (3) - проверава да ли је исмевани објекат током теста позиван / реаговао са најмање три пута. Дакле, било која од 0,1,2 или 3 интеракције са лажним материјалом треба да учини верификацију успешном.
// Arrange when(mockedIntList.get(anyInt())).thenReturn(3); // Act int response = mockedIntList.get(5); response = mockedIntList.get(2); // Assert verify(mockedIntList, atMost(2)).get(anyInt()); verify(mockedIntList, atMost(2)).size();
# 2) Подударање аргумената
У горенаведеном позиву, подударања се могу комбиновати заједно са подударањима аргумената како би се потврдили аргументи којима је позван лажни израз.
- било који()
- Одређене вредности - Потврдите помоћу одређених вредности када су аргументи познати унапред.
- Остала подударања аргумената попут - аниИнт (), аниСтринг () итд.
савети и Трикови
# 1) Коришћење Аргумент Цаптуре током верификације
Провера Аргумент Цаптуре је обично корисна када се аргумент који користи нека метода са пребацивањем не преноси директно путем позива методе, већ се креира интерно када се позове метода која се тестира.
Ово је у основи корисно тамо где ваш метод зависи од једног или више сарадника чије је понашање окрњено. Аргументи прослеђени овим сарадницима су интерни објекат или потпуно нови скуп аргумената.
Потврђивање стварног аргумента са којим би сарадници били позвани осигурава пуно поверења у код који се тестира.
Моцкито нуди АргументЦаптор који се може користити за верификацију, а онда када се позове „АгументЦаптор.гетВалуе ()“, можемо тврдити стварни ухваћени аргумент против очекиваног.
Да бисте то илустровали, погледајте пример у наставку:
У доњој методи, ЦалцуПрице је модел са класом ИнвенториМодел који се креира унутар тела методе које затим ИнвенториСервице користи за ажурирање.
Сада, ако желите да напишете тест за потврду са којим аргументом је позван инвенториСервице, можете једноставно да користите објект АргументЦаптор типа ИнвенториМодел класе.
Метода која се испитује:
public double calculatePrice(int itemSkuCode) { double price = 0; // get Item details ItemSku sku = itemService.getItemDetails(itemSkuCode); // update item inventory InventoryModel model = new InventoryModel(); model.setItemSku(sku); model.setItemSuppliers(new String(){'Supplier1'}); inventoryService.updateInventory(model, 1); return sku.getPrice(); }
Тест код: Погледајте корак верификације где је инвенториСервице верификован, аргументЦаптор је замењен објектом који треба да се подудара.
Затим једноставно потврдите вредност позивањем методе гетВалуе () на објекту АргументЦаптор.
Пример: АргументЦапторОбјецт.гетВалуе ()
public void calculatePrice_withValidItemSku_returnsSuccess() { // Arrange ItemSku item1 = new ItemSku(); item1.setApplicableDiscount(5.00); item1.setPrice(100.00); CustomerProfile customerProfile = new CustomerProfile(); customerProfile.setExtraLoyaltyDiscountPercentage(2.00); double expectedPrice = 93.00; // Arrange when(mockedItemService.getItemDetails(anyInt())).thenReturn(item1); ArgumentCaptor argCaptorInventoryModel = ArgumentCaptor.forClass(InventoryModel.class); // Act priceCalculator.calculatePrice(1234); // Assert verify(mockedItemService).getItemDetails(anyInt()); verify(mockedInventoryService).updateInventory(argCaptorInventoryModel.capture(), eq(1)); assertEquals(argCaptorInventoryModel.getValue().itemSku, item1);
Без АргументЦаптор не би било начина да се идентификује са којим аргументом је упућен позив услуге. Најбоље је користити „било који ()“ или „било који (ИнвенториМодел.цласс)“ за проверу аргумената.
како се пишу тестови
# 2) Уобичајени изузеци / грешке током коришћења Матцхера
Док користите Матцхерс, постоје одређене конвенције којих се треба придржавати, а ако се не поштују, резултираће избацивањем изузетка. Најчешћи на који сам наишао је док се трља и верификује.
Ако користите било који аргументМатцхерс и ако стуббед метода има више аргумената, онда се сви аргументи требају споменути подударањем, у супротном ниједан од њих не би требало да има подударања. Шта ово значи?
Покушајмо ово да разумемо у сценарију (а затим узорак кода за овај сценарио)
- Претпоставимо да метода која се тестира има потпис попут -
цонцатенатеСтринг (Стринг арг1, Стринг арг2) - Сада када клатите - претпоставимо да знате вредност арг1, али арг2 је непознат, па сте одлучили да користите подударање аргумената попут - ани () или аниСтринг () и наводећи вредност за први аргумент попут неког текста „здраво“.
- Када се спроведе горњи корак и изврши тест, тест избацује изузетак под називом „ИнвалидУсеОфМатцхерсЕкцептион“
Покушајмо ово да разумемо на примеру:
Тест код:
// Arrange when(a gMatcher.concatenateString('hello', anyString())).thenReturn('hello world!'); // Act String response = argMatcher.concatenateString('hello', 'abc'); // Assert verify(argMatcher).concatenateString(anyString(), anyString());
Предмет који се тестира:
public class ArgMatcher { public String concatenateString(String arg1, String arg2) { return arg1.concat(arg2); } }
Када се изврши горњи тест, враћа се у „ ИнвалидУсеОфМатцхерсЕкцептион '
Шта је разлог за овај изузетак?
То је кицање помоћу подударања дела и дела фиксног низа, тј. Поменули смо једно подударање аргумената као „здраво“, а друго као аниСтринг (). Сада постоје 2 начина да се решите ове врсте изузетака (Такође имајте на уму - да се ово понашање односи и на Моцк поставке, као и на понашање).
# 1) Користите подударање аргумената за све аргументе:
// Arrange when(a gMatcher.concatenateString(anyString(), anyString())).thenReturn('hello world!'); // Act String response = argMatcher.concatenateString('hello', 'abc'); // Assert verify(argMatcher).concatenateString(anyString(), anyString());
# 2) Користите ек () као Аргумент Матцхер где је аргумент познат. Дакле, уместо да наводите аргумент као „здраво“, наведите га као „ек („ здраво “) и ово би требало да учини да се кицање успешно изврши.
// Arrange when(argMatcher.concatenateString(anyString(), eq('world'))).thenReturn('hello world!'); // Act String response = argMatcher.concatenateString('hello', 'world'); // Assert verify(argMatcher).concatenateString(anyString(), eq('world'));
Закључак
У овом чланку видели смо како се користе различите врсте подударања које нуди Моцкито.
Овде смо покрили оне најчешће коришћене. За упућивање на целу листу, документација Моцкито библиотеке је добар извор референце.
Погледајте наш предстојећи водич да бисте сазнали више о приватним, статичким и празним методама ругања.
ПРЕВ Туториал |. | СЛЕДЕЋА Лекција
Препоручено читање
- Стварање ругалица и шпијуна у Моцкито-у са примерима кода
- Водич за Моцкито: Моцкито оквир за ругање у јединственом тестирању
- Врсте ризика у софтверским пројектима
- Питхон типови података
- Типови података Ц ++
- 12 најпопуларнијих питања о Моцкито интервјуу (Моцкинг Фрамеворк Интервиев)
- Ругање приватним, статичким и празним методама коришћењем Моцкито-а
- Врсте наслеђивања у Ц ++