Це чудове питання! Я думаю, що першопричина цього полягає в тому, що ми використовуємо JUnit не лише для тестування одиниць. Тож питання слід розділити:
- Чи слід використовувати Mockito.verify () для моєї інтеграції (або будь-якого іншого тестування, що не перевищує одиниці)?
- Чи варто використовувати Mockito.verify () під час тестування модулів у чорному ящику ?
- Чи варто використовувати Mockito.verify () під час мого тестування блоку білого поля ?
тож якщо ми будемо ігнорувати тестування, що перевищує одиницю, питання можна перефразувати " Використання тестування модулів білої коробки з Mockito.verify () створює велику пару між тестовою одиницею та моєю реалізацією, чи можу я зробити " сірий ящик " " одиничне тестування та які правила слід використовувати для цього ".
Тепер переглянемо все це покроково.
* - Чи повинен я використовувати Mockito.verify () в моїй інтеграції (або будь-яке інше тестування, яке не перевищує одиницю)? Я думаю, що відповідь однозначно ні, більше того, ви не повинні використовувати для цього макети. Ваш тест повинен бути максимально наближений до реального застосування. Ви перевіряєте повний випадок використання, а не окрему частину програми.
* тестування блоку black-box vs white-box * Якщо ви використовуєте підхід black-box, чим ви насправді займаєтесь, ви надаєте (усі класи еквівалентності) введення, стан та тести, які отримаєте очікуваний вихід. У такому підході використання макетів взагалі виправдовується (ви просто імітуєте, що вони роблять правильно; ви не хочете їх перевіряти), але викликати Mockito.verify () є зайвим.
Якщо ви використовуєте білий підхід, що ви насправді робите, ви тестуєте поведінку свого підрозділу. При такому підході виклик Mockito.verify () має важливе значення, ви повинні переконатися, що ваш пристрій поводиться так, як ви розраховуєте.
правила великого пальця для тестування на сіру коробку
Проблема тестування у білій коробці полягає в тому, що вона створює високу муфту. Одне з можливих рішень - це зробити тестування сірого кольору, а не тестування білого поля. Це своєрідне поєднання тестування чорно-білих коробок. Ви дійсно випробовуєте поведінку свого підрозділу, як у тестуванні у білій коробці, але в цілому ви робите це реалізацією-агностиком, коли це можливо . Коли це можливо, ви просто зробите чек, як у випадку з чорною скринькою, лише стверджуєте, що вихід - це те, що очікується. Отже, суть вашого питання полягає в тому, коли це можливо.
Це справді важко. У мене немає хорошого прикладу, але я можу навести вам приклади. У випадку, про який було сказано вище, рівним () vs equalsIgnoreCase (), ви не повинні викликати Mockito.verify (), просто стверджуйте результат. Якщо ви не змогли цього зробити, розбийте свій код на меншу одиницю, поки не зможете це зробити. З іншого боку, припустимо, у вас є @Service, і ви пишете @ Web-Service, яка по суті є обгорткою для вашої @Service - вона делегує всі дзвінки до @Service (і робить деякі додаткові поводження з помилками). У цьому випадку необхідний дзвінок на Mockito.verify (), ви не повинні дублювати всі ваші чеки, які ви зробили для @Serive, переконуючись, що ви телефонуєте на @Service з правильним списком параметрів.