То, что вы описываете, являются интеграционные тесты и что-то Spring Data GemFire делает почти точно так, как вы описали, хотя и немного более непосредственно (т.е. инъекционные GemFire регионов или, возможно, другие компоненты GemFire непосредственно в тестовые классы). Например, посмотрите на класс GemFireTemplateIntegrationTest вместе с его ассоциированным Spring (XML) config.
Это имеет смысл для Данные весны GemFire для использования компонентов GemFire непосредственно в тестах. Хотя, пожалуй, это не идеальный вариант в наборе реальных приложений, прежде всего потому, что я верю в хорошее разделение проблем и предоставления соответствующих фасадов вокруг зависимостей, которые использует мое приложение.
Другими словами, и, как вы уже упоминалось выше, имеющий следующий (традиционный п) ярусы в приложении ...
UI -> Сервис -> DAO
Служба уровня чистый бизнес логики и правил и любых взаимодействий (CRUD, Querying, Function execution и т. д.) с любым хранилищем данных (GemFire / Geode включено) осуществляется через DAO.
Это делает насмехаться над DAO очень просто, чтобы вы могли сосредоточиться на точке тестов Service, протестировать бизнес-логику и правила независимо от того, как ведет себя основной хранилище данных.
Конечно, важно иметь интеграционные тесты для обеспечения правильного взаимодействия с вашим базовым хранилищем данных, например GemFire / Geode, если только для обеспечения надлежащего транзакционного поведения или того, что ваши операторы OQL (запроса) хорошо сформированы ,
Но есть много вариантов, когда речь заходит о реализации вашего DAO.
Вы можете ввести Регион в свои DAO (ы) и выполнить операции (CRUD, Queries и т. Д.) Непосредственно в Регионе.
Если вы используете Spring Data GemFire , вы можете предпочесть, чтобы защитить ваши DAO (ы) от прямого использования GemFire / Geode API с использованием GemfireTemplate (в случае интерфейса нарушения изменений, внесенных GemFire / Geode, или для обертывания исключений GemFire / Geode в Весна удобна и согласована (через хранилища данных) Exception class hierarchy, что полезно, если вы когда-либо заменяете хранилища данных). См. here для получения более подробной информации.
Наконец (но не в последнюю очередь), вы можете использовать Spring Data GemFire-хextensionиз Repository абстракции Spring общие данные с поддержкой GemFire / Geode. Это делает реализацию DAO (репозитариев a.k.a.) простой в определении интерфейса, который расширяет GemfireRepository.
Ваш выбор зависит от уровня абстракции, который вы предпочитаете, и каждый из вариантов немного изменит подход к вашему тестированию интеграции.
Как один последний лакомый кусочек, это не мешает вам продолжать писать настоящие тесты единиц.
Спринг данных GemFire использует custom test framework (с издевается и заглушек) для упрощения модульных тестов с участием компонентов GemFire (такие как регионы, AEQs, шлюзы и т.д.). Этот «пользовательский тестовый каркас» внедрен в GemfireTestApplicationContextInitializer и связан с ним GemfireTestBeanPostProcessor. Если вы будете следовать логике, вы начнете видеть, как она работает.
Эта настраиваемая тестовая структура очень полезна для проверки правильности создания и инициализации компонентов GemFire с использованием SDG's XML namespace. Тем не менее, становится все более популярным размещать метаданные конфигурации, даже для компонентов GemFire / Geode, в Spring config now, что-то, что я искал enhance/simplify далее в Spring Data GemFire 1.9.
Кроме того, я надеюсь, в какой-то момент, работе, что я уже начал, чтобы возвысить и реорганизовать структуру теста пользовательских Spring Data GemFire в отдельное, верхнем уровне расширения Spring проекта для Spring Data GemFire так как этот вопрос был задан очень часто.
В любом случае, надеюсь, это даст вам несколько идей, как наилучшим образом подойти к испытаниям для вашего приложения простым, сжатым и последовательным образом.
Cheers!
Спасибо за четкий и подробный ответ John! Я согласен в принципе в отношении UnitTests, но всегда есть несколько частей, которые имеют некоторые общие данные на основе, которые легче иметь в источнике данных, а не издеваться над каждым объектом. Мы используем вариант № 3 для DAO, полагаясь на абстракцию пружинных данных. Каковы возможности тестирования интеграции без подключения к серверу common-gemfire? Я просто хочу использовать столько же, сколько существующие определения кэша, с помощью всего лишь нескольких конфигураций, которые заставят серверные кэши вести себя как области кэша в памяти и можно тестировать. –
На самом деле, это всего лишь вопрос об избежании затрат на запуск экземпляра (встроенного) GemFire, но вы можете свести к минимуму эту стоимость, установив перед собой несколько свойств GemFire System, таких как предупреждение уровня журнала (минимально) 'и mcast-port до' 0 '. Я сделал это во многих тестах интеграции SDG (например, https://github.com/jxblum/spring-data-gemfire/blob/master/src/test/resources/org/springframework/data/gemfire/GemfireTemplateIntegrationTest-context. xml # L13-L17) ... –
Установив mcast-порт в частности (без указателей), вы создаете автономный узел, который минимизирует накладные расходы на распространение (резервирование портов, создание сокетов, поиск других членов и т. д.), которые не требуется, если вы не тестируете многоузловой кластер в своем тестовом наборе. Как правило, для большинства тестовых случаев достаточно одного узла. Настройка многоузлового кластера является как дорогостоящей, так и сложной задачей, что команда GemFire создала отдельную структуру для (называемой Hydra). Это не тривиально. –