different types matchers provided mockito
найкращі програми для відновлення видалених файлів -
Вступ до різних типів матчів у Mockito.
Знущання та шпигуни в Mockito були детально пояснені в нашому попередньому посібнику Тренінгова серія Mockito .
Що таке матчери?
Збіги схожі на регулярні вирази або узагальнюючі символи, де замість конкретного вводу (і / або виводу) ви вказуєте діапазон / тип вводу / виводу, виходячи з того, що заглушки / шпигуни можуть відпочивати, а дзвінки до заглушок можна перевірити.
Усі матчі Mockito є частиною Mockito ' статичний клас.
Збіги - це потужний інструмент, який дозволяє скорочений спосіб налаштування заглушок, а також перевірку викликів на заглушках, згадуючи введення аргументів як загальні типи до конкретних значень залежно від випадку використання або сценарію.
Що ви дізнаєтесь:
Типи матчів у Mockito
У Mockito існує загалом 2 типи матчів або з точки зору використання, збіги можна використовувати для нижченаведених 2 категорій:
- Збіги аргументів під час встановлення заглушки
- Верифікаційні збіги для перевірки фактичних дзвінків на заглушки
Для обох типів збігів, тобто аргументації та перевірки, Mockito пропонує величезний набір збігів (натисніть тут щоб отримати повний список учасників матчів).
Аргумент збігів
Найбільш широко використовувані:
Для всього нижче, давайте розглянемо тестування IntegerList:
final List mockedIntList = mock(ArrayList.class);
# 1) any () - Приймає будь-який об'єкт (включаючи null).
when (mockedIntList.get( any ())).thenReturn(3);
# два) будь-який (клас мови Java) -
Приклад : будь-який (ClassUnderTest.class) - це більш конкретний варіант будь-якого () і приймає лише об’єкти типу класу, які згадані як параметр шаблону.
when (mockedIntList.get( any (Integer.class))).thenReturn(3);
# 3) anyBoolean (), anyByte (), anyInt (), anyString (), anyDouble (), anyFloat (), anyList () та багато іншого - усі вони приймають будь-який об'єкт відповідного типу даних, а також нульові значення.
when (mockedIntList.get( any Int())).thenReturn(3);
# 4) Конкретні аргументи - У випадках, коли фактичні аргументи відомі заздалегідь, завжди рекомендується їх використовувати, оскільки вони забезпечують більшу впевненість щодо загальних типів аргументів.
Приклад:
when(mockedIntList.get(1)).thenReturn(3);
Перевірка збігів
Є кілька спеціалізованих збігів, які можна очікувати / стверджувати такі речі, як ні. викликів на макет.
Для всіх наведених нижче збігів розглянемо той самий список прикладів, який ми використовували раніше.
final List mockedIntList = mock(ArrayList.class);
# 1) Знущання над закликами
(i) Просте виклик у Mock перевіряє, чи викликаний метод був використаний / взаємодіяв чи ні, встановивши розмір списку глузувань до 5.
//arrange when(mockedList.size()).thenReturn(5); // act int size = mockedList.size(); // assert verify(mockedList).size();
(ii) Конкретна кількість взаємодій із знущаним методом підтверджує кількість ні. разів, як очікувалося, буде викликана насмішка.
//arrange when(mockedList.size()).thenReturn(5); // act int size = mockedList.size(); // assert verify(mockedList, times(1)).size();
Для того, щоб перевірити 0 взаємодій, просто змініть значення з 1 на 0 як аргумент для збігу times ().
//arrange when(mockedList.size()).thenReturn(5); // act int size = mockedList.size(); // assert verify(mockedList, times(0)).size();
У разі збоїв він повертає такі винятки:
до) Коли очікувані виклики менше фактичних викликів:
де знаходяться apk, що зберігаються на android
Приклад: Бажав 2 рази, але закликав 3 рази, потім Мокіто повертається - “ перевірка.TooManyActualInvocations '
Приклад коду:
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 рази, але 1 раз викликали, тоді Мокіто повертається - “ перевірка.TooLittleActualInvocations '
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());
(iii) Жодної взаємодії з конкретним методом знущаного об’єкта.
final List mockedIntList = mock(ArrayList.class); // Arrange when(mockedIntList.get(anyInt())).thenReturn(3); // Act int response = mockedIntList.get(5); // Assert verify(mockedIntList, never()).size();
(iv) Перевірити порядок знущаних взаємодій - Це особливо корисно, коли ви хочете забезпечити порядок, у якому були викликані методи на знущані об’єкти.
Приклад: База даних, як операції, коли тест повинен перевірити порядок, в якому відбувалися оновлення бази даних.
Щоб проілюструвати це на прикладі - Давайте продовжимо той самий перелік прикладів.
Тепер припустимо, що порядок викликів методів списку був у послідовності, тобто get (5), size (), get (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());
У разі неправильної послідовності перевірки Mockito видає виняток - тобто ' verify.VerificationInOrderFailure '.
Отже, у наведеному вище прикладі, якщо я зміню порядок перевірки, помінявши місцями останні 2 рядки, я почну отримувати виключення VerificationInOrderFailure.
// 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();
(V) Переконайтеся, що взаємодія відбулася щонайменше / принаймні стільки разів.
(до) принаймні:
Приклад: atleast (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());
У разі помилок, тобто, коли фактичні виклики не збігаються, виникає той самий виняток, що і у збігу times (), тобто ' verify.TooLittleActualInvocations ”
(b) максимум:
Приклад: atmost (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) Відповідність аргументів
У вищезазначеному виклику збіги можна поєднувати разом із збігами аргументів, щоб перевірити аргументи, з якими був викликаний макет.
- будь-який ()
- Конкретні значення - Перевірте конкретні значення, коли аргументи відомі заздалегідь.
- Інші відповідні аргументи, такі як - anyInt (), anyString () тощо.
Поради та підказки
# 1) Використання Argument Capture під час перевірки
Перевірка захоплення аргументів, як правило, корисна, коли аргумент, який використовується яким-небудь прихованим методом, не передається безпосередньо через виклик методу, а створюється внутрішньо, коли викликається тестований метод.
Це, по суті, корисно, коли ваш метод залежить від одного або декількох співавторів, поведінка яких була пригнічена. Аргументи, передані цим співавторам, є внутрішнім об'єктом або цілком новим набором аргументів.
звіт про відстеження часу jira користувачем
Перевірка фактичного аргументу, за допомогою якого було б викликано співавторів, забезпечує велику впевненість у коді, який перевіряється.
Mockito надає ArgumentCaptor, який можна використовувати для перевірки, а потім, коли викликається “AgumentCaptor.getValue ()”, ми можемо затвердити фактичний захоплений аргумент проти очікуваного.
Щоб проілюструвати це, зверніться до прикладу нижче:
У наведеному нижче методі, CalcuPrice - це модель із класом InventoryModel, створена всередині тіла методу, яка потім використовується InventoryService для оновлення.
Тепер, якщо ви хочете написати тест для перевірки того, яким аргументом був викликаний inventoryService, ви можете просто використовувати об'єкт ArgumentCaptor типу InventoryModel class.
Тестований метод:
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(); }
Тестовий код: Подивіться на крок перевірки, де перевіряється inventoryService, підставляється об'єкт argumentCaptor, для якого аргумент потрібно зіставити.
Потім просто затвердіть значення, викликавши метод getValue () для об'єкта ArgumentCaptor.
Приклад: ArgumentCaptorObject.getValue ()
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);
Без ArgumentCaptor не було б способу визначити, з яким аргументом був зроблений виклик служби. Найкраще використовувати 'any ()' або 'any (InventoryModel.class)' для перевірки аргументів.
# 2) Поширені винятки / помилки під час використання збігів
Під час використання збігів існують певні домовленості, яких слід дотримуватись, і якщо їх не дотримуватися, то виникає виняток. Найпоширеніший, з яким я зіткнувся, - це під час затягування та перевірки.
Якщо ви використовуєте будь-який argumentMatchers і якщо метод stubbed має більше одного аргументу (аргументів), тоді або всі аргументи повинні бути згадані зі збігами, інакше жоден з них не повинен мати збігів. Що це означає?
Спробуємо зрозуміти це за сценарієм (а потім зразком коду для цього сценарію)
- Припустимо, метод, що перевіряється, має підпис, як -
concatenateString (рядок arg1, рядок arg2) - Тепер, коли затискач - припустимо, ви знаєте значення arg1, але arg2 невідомий, тому ви вирішили використовувати збіг аргументів типу - any () або anyString () і вказавши значення для першого аргументу, як-от текст «привіт».
- Коли вищевказаний крок реалізований і тест виконаний, тест видає виняток, який називається “InvalidUseOfMatchersException”
Спробуємо зрозуміти це на прикладі:
Тестовий код:
// 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); } }
Коли вищезазначений тест виконується, він повертається в “ InvalidUseOfMatchersException '
Тепер, у чому причина цього винятку?
Це заглушення за допомогою збігів частин та фіксованого рядка, тобто ми згадали один збіг аргументів як “привіт”, а другий як anyString (). Зараз існує 2 способи позбутися такого роду винятків (також зауважте - така поведінка стосується як налаштувань Mock, так і поведінки).
# 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) Використовуйте eq () як збіг аргументів, де аргумент відомий. Отже, замість того, щоб вказувати аргумент як “привіт”, вкажіть його як “eq (“ привіт ”), і це повинно зробити ударення успішним.
// Arrange when(argMatcher.concatenateString(anyString(), eq('world'))).thenReturn('hello world!'); // Act String response = argMatcher.concatenateString('hello', 'world'); // Assert verify(argMatcher).concatenateString(anyString(), eq('world'));
Висновок
У цій статті ми побачили, як використовувати різні типи збігів, надані Mockito.
Тут ми розглянули найбільш широко використовувані. Для посилання на повний список документація Mockito Library є хорошим джерелом посилань.
Перегляньте наш майбутній підручник, щоб дізнатися більше про приватні, статичні та порожнечі методи знущань.
НАЗАД Підручник | НАСТУПНИЙ підручник
Рекомендована література
- Створення знущань та шпигунів у Mockito за допомогою прикладів коду
- Підручник Mockito: Mockito Framework для знущань під час модульного тестування
- Види ризиків у програмних проектах
- Типи даних Python
- Типи даних C ++
- Найпопулярніші 12 запитань інтерв’ю Mockito (глузуюче рамкове інтерв’ю)
- Знущання над приватними, статичними та недійсними методами за допомогою Mockito
- Типи успадкування в C ++