У меня следующий вызов, и я не нашел хорошего ответа. Я использую среду Mocking (в данном случае JMock), чтобы позволить модульным тестам быть изолированными от кода базы данных. Я издеваюсь над доступом к классам, которые включают логику базы данных, и отдельно тестирую классы базы данных, используя DBUnit.
Проблема, с которой я столкнулся, заключается в том, что я замечаю схему, в которой логика концептуально дублируется в нескольких местах. Например, мне нужно обнаружить, что значение в базе данных не существует, поэтому в этом случае я мог бы вернуть значение null из метода. Итак, у меня есть класс доступа к базе данных, который выполняет взаимодействие с базой данных и возвращает ноль соответственно. Затем у меня есть класс бизнес-логики, который получает пустое значение из макета, а затем проверяется на правильность действий, если значение равно нулю.
Теперь, что если в будущем такое поведение нужно изменить и возвращать нуль больше не нужно, скажем, потому что состояние усложнилось, поэтому мне нужно будет вернуть объект, который сообщает, что значение не существует, и некоторые дополнительный факт из базы данных.
Теперь, если я изменю поведение класса базы данных, чтобы больше не возвращать ноль в этом случае, класс бизнес-логики все равно будет функционировать, и ошибка будет обнаружена только в QA, если кто-то не запомнит связь, или правильно следовал правилам использования метода.
Я упал, как будто что-то упустил, и должен быть лучший способ избежать этого концептуального дублирования или, по крайней мере, проверить его так, чтобы в случае его изменения тот факт, что изменение не распространяется, приводит к сбою модуля тест.
Есть предложения?
UPDATE:
Позвольте мне попытаться уточнить мой вопрос. Я думаю о том, когда код эволюционирует с течением времени, как обеспечить, чтобы интеграция не нарушалась между классами, протестированными с помощью макета, и реальной реализацией того класса, который представляет макет.
Например, у меня просто был случай, когда у меня был метод, который был изначально создан и не ожидал нулевых значений, так что это не был тест на реальном объекте. Затем пользователь класса (проверенный с помощью макета) был расширен, чтобы при определенных обстоятельствах передавать нулевое значение в качестве параметра. На интеграции это сломалось, потому что реальный класс не был проверен на ноль. Теперь при создании этих классов вначале это не имеет большого значения, потому что вы тестируете оба конца в процессе сборки, но если дизайн должен развиваться два месяца спустя, когда вы склонны забывать о деталях, как бы вы тестировали взаимодействие между эти два набора объектов (один из них протестирован с помощью имитации против фактической реализации)?
Основная проблема, по-видимому, заключается в дублировании (которое нарушает принцип СУХОЙ), ожидания действительно держатся в двух местах, хотя взаимосвязь носит концептуальный характер, в действительности нет дублирующего кода.
[Изменить после второго редактирования Аарона Дигуллы на его ответ]:
Правильно, это именно то, что я делаю (за исключением того, что есть некоторое дальнейшее взаимодействие с БД в классе, который тестируется через DBUnit и взаимодействует с базой данных во время ее тестов, но это та же идея) , Итак, скажем, нам нужно изменить поведение базы данных, чтобы результаты были другими. Тест, использующий макет, будет продолжать проходить, если 1) кто-то не помнит или 2) он не сломается при интеграции Таким образом, возвращаемые значения (скажем) хранимой процедуры по существу дублируются в тестовых данных макета. Теперь, что беспокоит меня о дублировании, это то, что логика дублируется, и это является тонким нарушением СУХОГО. Возможно, так оно и есть (в конце концов, есть причина для интеграционных тестов), но я чувствовал, что вместо этого я что-то упускаю.
[Изменить при запуске щедрости]
Чтение взаимодействия с Аароном доходит до сути вопроса, но что я действительно ищу, так это некоторое понимание того, как избежать или управлять явным дублированием, чтобы изменение поведения реального класса показало в модульных тестах, которые взаимодействуют с макетом как то, что сломалось. Очевидно, что это не происходит автоматически, но может быть способ правильно разработать сценарий.
[Изменить присуждение награды]
Спасибо всем, кто потратил время, отвечая на вопрос. Победитель научил меня чему-то новому о том, как думать о передаче данных между двумя слоями, и первым получил ответ.