【发布时间】:2011-03-15 19:51:52
【问题描述】:
容器内测试通常与使用模拟对象进行测试相反。然而,由于模拟对象只是模仿真实对象的行为,容器内测试难道不是在其真实环境中真正测试系统的唯一方法吗?
作为容器内测试和模拟对象的部分替代方案,Spring 提供了TestContext 框架,它可以很好地初始化 Spring,而无需启动实际的应用程序容器(在我的例子中是 Web 应用程序服务器)。然而,这是一种有限的方法,因为它只初始化特定于 Spring 的特性,而不支持特定于应用程序服务器的特性。所以你不能测试一切。此外,由于它与实际 Web 执行中使用的默认 WebApplicationContext 不是 100% 相同,这种方法是不是有点 hackyish?不好吗?
对于容器内测试,至少有Cactus(过时)、Jeeunit(一个很小的项目)和JBoss Arquillian(仍然是 alpha,但看起来很有希望)。我没有看到这些项目中的任何一个被广泛使用,那么容器内测试有什么不好的地方吗?容器内测试经常提到的主要缺点是执行速度慢。但是,当在持续集成环境和相对较小的项目中运行时,这应该不是问题。
总结一下:我们应该进行容器内测试还是容器外测试,为什么?在集成测试中使用模拟对象或替代初始化机制(如在 Spring TestContext 中)会不会感觉不好?
附注:我最近询问了categorization of integration test,这可能是相关的。
【问题讨论】:
标签: java testing mocking integration-testing application-server