То, что вы пытаетесь сделать, это не модульное тестирование
Если вы проверяете, являются ли возвращаемые объекты экземплярами определенных конкретных классов, вы не тестируете модули. Вы тестирование интеграции. Хотя интеграционное тестирование важно, это не одно и то же.
В модульном тестировании вам нужно только протестировать сам объект. Если вы утверждаете конкретный тип возвращаемых абстрактных объектов, вы проверяете реализацию возвращаемого объекта.
Юнит-тестирование на объектах в целом
При модульном тестировании нужно утверждать четыре вещи:
- Возвращаемые значения запросов (не пустые методы) - это то, что вы ожидаете от них.
- Побочные эффекты команд (методы void) изменяют сам объект так, как вы ожидаете.
- Получены команды, отправленные другим объектам (обычно это делается с помощью насмешек).
Кроме того, вы хотите проверить только то, что можно наблюдать из экземпляра объекта, то есть из открытого интерфейса. В противном случае вы привязываете себя к конкретному набору деталей реализации. Это потребует от вас изменения ваших тестов, когда эти детали изменятся.
Фабрики модульных испытаний
Модульное тестирование на фабриках действительно неинтересно, потому что вас не интересует поведение возвращаемых объектов запросов . Такое поведение (мы надеемся) проверено везде, вероятно, при модульном тестировании самого объекта. Вас действительно действительно интересует, имеет ли возвращаемый объект правильный тип , что гарантируется, если ваша программа компилируется.
Поскольку фабрики не меняются с течением времени (потому что тогда они будут "строителями", что является другим шаблоном), нет команд для тестирования.
Фабрики отвечают за создание экземпляров объектов, поэтому они не должны зависеть от других фабрик, которые делают это для них. Они могут зависеть от Строителя, но даже в этом случае мы не должны проверять правильность Строителя, только независимо от того, получит ли Строитель сообщение.
Это означает, что все, что вам нужно проверить на фабриках, - отправлять ли они сообщения объектам, от которых они зависят. Если вы используете Dependency Injection, это почти тривиально. Просто смоделируйте зависимости в ваших модульных тестах и убедитесь, что они получают сообщения.
Сводка заводов по модульному тестированию
- Не проверяйте ни поведение, ни детали реализации возвращаемых объектов! Ваша фабрика не несет ответственности за реализацию экземпляров объекта!
- Проверьте, получены ли команды, отправленные зависимостям.
Вот и все. Если нет никаких зависимостей, тестировать нечего. За исключением, может быть, утверждения, что возвращаемый объект не является ссылкой null
.
Фабрики интеграционных испытаний
Если у вас есть требование, чтобы возвращаемый тип абстрактного объекта был экземпляром определенного конкретного типа, то это подпадает под интеграционное тестирование.
Другие здесь уже ответили, как это сделать с помощью оператора instanceof
.