Это отличный вопрос! Я думаю, что основная причина этого заключается в следующем, мы используем JUnit не только для модульного тестирования. Таким образом, вопрос должен быть разделен:
- Должен ли я использовать Mockito.verify () в моей интеграции (или любом другом тестировании выше единицы)?
- Должен ли я использовать Mockito.verify () в моем черном ящике модульном тестировании ?
- Должен ли я использовать Mockito.verify () в моем модульном тестировании белого ящика ?
так что, если мы будем игнорировать тестирование выше, чем модуль, вопрос можно перефразировать: « Использование модульного тестирования белого ящика с Mockito.verify () создает отличную пару между модульным тестом и моей возможной реализацией, могу ли я создать некоторый « серый ящик » « юнит-тестирование и какие практические правила я должен использовать для этого ».
Теперь давайте пройдемся по всему этому шаг за шагом.
* - Должен ли я использовать Mockito.verify () в моей интеграции (или любом другом тестировании, превышающем единицу) тестировании? * Я думаю, что ответ однозначно нет, более того, вы не должны использовать макеты для этого. Ваш тест должен быть максимально приближен к реальному применению. Вы тестируете полный вариант использования, а не изолированную часть приложения.
* черный ящик против модульного тестирования белого ящика * Если вы используете подход черного ящика, что вы действительно делаете, вы предоставляете (все классы эквивалентности) входные данные, состояние и тесты, которые вы получите ожидаемый результат. При таком подходе использование mocks в целом оправдывает (вы просто имитируете, что они делают правильные вещи; вы не хотите их проверять), но вызов Mockito.verify () излишен.
Если вы используете подход « белого ящика», что вы действительно делаете, вы тестируете поведение своего устройства. В этом подходе необходим вызов Mockito.verify (), вы должны убедиться, что ваш юнит ведет себя так, как вы ожидаете.
правила большого пальца для тестирования
« серого ящика» Проблема с тестированием белого ящика заключается в том, что оно создает высокую связь. Одним из возможных решений является тестирование «серого ящика», а не «белого ящика». Это своего рода комбинация черно-белого тестирования. Вы действительно тестируете поведение вашего модуля, как в тесте белого ящика, но в целом вы делаете его независимым от реализации, когда это возможно . Когда это возможно, вы просто сделаете проверку, как в случае с черным ящиком, просто подтвердите, что выход - это то, что вы ожидаете. Итак, суть вашего вопроса в том, когда это возможно.
Это действительно сложно. У меня нет хорошего примера, но я могу привести примеры. В случае, который был упомянут выше с помощью equals () vs equalsIgnoreCase (), вы не должны вызывать Mockito.verify (), просто подтвердить вывод. Если вы не смогли этого сделать, разбейте ваш код на меньшие единицы, пока не сможете это сделать. С другой стороны, предположим, что у вас есть некоторый @Service и вы пишете @ Web-Service, который по сути является оберткой для вашего @Service - он делегирует все вызовы @Service (и делает некоторую дополнительную обработку ошибок). В этом случае необходим вызов Mockito.verify (), вам не следует дублировать все свои проверки, которые вы делали для @Serive, достаточно убедиться, что вы вызываете @Service с правильным списком параметров.