对于使用GemFire的单元测试服务,我们计划在测试环境中包含GemFire“Regions”以避免模拟并且对Gemfire服务器有任何依赖性。有哪些最佳实践/工具可以实现此目的?
理论上,下面是我们计划的选项:
服务 - > GemFire(嵌入在测试环境中)
要引导上下文, ContextConfiguration:添加一个test-applicationContext,它引用了gfe-cache xml。
Junits将加载测试上下文并引导区域,现在我们可以使用GemFire触发创建/获取/删除并验证结果。
答案 0 :(得分:1)
您所描述的是集成测试和某些 Spring Data GemFire 几乎与您描述的完全一样,尽管更直接(即将GemFire区域或其他GemFire组件直接注入测试类)。例如,查看GemFireTemplateIntegrationTest课程及其相关的Spring (XML) config。
Spring Data GemFire 在测试中直接使用GemFire组件是有意义的。虽然,在实际的应用程序测试套件中,这可能不太理想,主要是因为我相信良好的关注点,并为我的应用程序使用的依赖项提供适当的外观。
换句话说,正如您在上面提到的那样,在应用程序中具有以下(传统的n)层......
用户界面 - >服务 - > DAO
服务层是纯粹的业务逻辑和规则,任何数据存储(包括GemFire / Geode)的交互(CRUD,查询,函数执行等)都是通过DAO完成的。
这使得模拟DAO非常容易,因此您可以专注于服务测试的重点,独立于底层数据存储的行为来测试业务逻辑和规则。
当然,进行集成测试以确保与底层数据存储(例如GemFire / Geode)的正确交互非常重要,如果只是为了确保正确的事务行为,或者您的OQL(查询)语句已经很好地形成。
但是,在实现DAO时有很多选择。
您可以将Region注入您的DAO并直接在Region上执行操作(CRUD,Queries等)。
如果您使用的是 Spring Data GemFire ,您可能更愿意使用GemfireTemplate保护您的DAO不直接使用GemFire / Geode API(以防万一)界面破坏GemFire / Geode引入的变化,或者将 Spring&#; em>中的GemFire / Geode异常包装在方便且一致的(跨数据存储)Exception class hierarchy,这对你来说很有用换出数据存储)。有关详细信息,请参阅here。
最后(但并非最不重要),您可以使用 Spring Data Gem的 Spring Data GemFire extension 存储库抽象,支持GemFire / Geode。这使得实现DAO(a.k.a.存储库)就像定义扩展GemfireRepository的接口一样简单。
您的选择取决于您喜欢的抽象级别,每个选择都会略微改变您进行集成测试的方式。
作为最后一项消息,这并不妨碍您仍然编写真正的单元测试。
Spring Data GemFire 使用custom test framework(带有模拟和存根)来简化涉及GemFire组件(例如区域,AEQ,网关等)的单元测试。这个" 自定义测试框架"根植于GemfireTestApplicationContextInitializer和相关的GemfireTestBeanPostProcessor。如果您遵循逻辑,您将开始了解它是如何工作的。
此自定义测试框架对于测试使用SDG's XML namespace创建和初始化的GemFire组件的有效性非常有用。然而,将配置元数据(即使是GemFire / Geode组件)放入Spring config now变得越来越流行,我希望{em>在Spring数据GemFire 1.9中进一步enhance/simplify
此外,我希望,在某些时候,我已经开始的工作,将 Spring Data GemFire的自定义测试框架提升并重构为一个单独的顶级Spring Spring Data GemFire 的项目扩展,因为这类问题已被大量提问。
无论如何,希望这能为您提供一些如何以简单,简洁和一致的方式为您的应用程序进行最佳测试的想法。
干杯!