容器内测试通常与使用模拟对象进行测试相反。但是,由于模拟对象只是模仿真实对象的行为,因此容器内测试不是真正在真实环境中测试系统的唯一方法吗?容器内测试与模拟对象进行集成测试
作为容器内部测试和模拟对象的部分替代方案,Spring提供了TestContext
框架,它可以很好地初始化Spring,而无需启动实际的应用程序容器(在我的情况下为Web应用程序服务器)。然而,这是有限的方法,因为它只初始化Spring特有的功能,而不支持应用程序服务器特定的功能。所以你不能测试一切。另外,因为它与用于真正web执行的默认WebApplicationContext
不是100%相同,所以这种方法有点不合理吗?它不好吗?
对于容器内测试,至少有Cactus(过时),Jeeunit(一个非常小的项目)和JBoss Arquillian(仍然是α,但看起来很有希望)。我没有看到任何这些项目被广泛使用,那么容器内测试有什么不好的地方?容器内测试经常提到的主要缺点是执行速度慢。但是,当在持续集成环境中运行并且在相对较小的项目中运行时,这应该不成问题。
总结:我们应该进行容器内外测试还是为什么?使用模拟对象或替代初始化机制(如在Spring TestContext中)来进行集成测试会感觉不好吗?
附注:我最近问了一下categorization of integration test,这可能是相关的。
我非常好地运行了容器外的单元测试。其实,我不明白你为什么要运行“几个小容器内单元测试”来测试“弹簧布线”和东西?也许你在那里弄错了,你的意思是“一对小容器内集成测试*”吗?另外,我的理解是否正确:如果对运行时配置进行更改,则必须将该设置复制到集成测试项目中?您如何实际运行/初始化容器内测试?在某种框架的帮助下可能? – 2010-07-14 13:13:59
我编辑了该部分。我的意思是我们在我们的单元测试集合中进行了几次集成测试,以确保所有的Spring接线都能正常工作。所有配置文件都带有代码 - 我们不会将任何配置复制到集成项目中。集成项目与生产代码共享相同的包路径,因此可以加载所有相同的src/main/resource(我们使用mvn)configs。 – Gray 2010-07-14 13:33:00