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