如果JavaEE应用程序被设计为在Tomcat容器中运行,那么所有的集成测试都应该在类似的容器中运行吗?

如果JavaEE应用程序被设计为在Tomcat容器中运行,那么所有的集成测试都应该在类似的容器中运行吗?,java,spring,tomcat,maven,Java,Spring,Tomcat,Maven,我最近接手了一个Spring/JPA/Hibernate/Maven项目,我是JavaEE开发的新手。当这个项目运行时,它依赖于Tomcat来启动,这样它就可以访问数据库。据我所知,这被称为“在Tomcat容器中运行” 我正在尝试让一个简单的集成测试工作,但在让测试成功连接到数据库时遇到了问题。我已经将POM设置为在预集成测试阶段运行Tomcat,这样集成测试就可以准确地连接到数据库,而实际应用程序是如何连接的 这是正确的方法,还是在测试应用程序上下文中通过某种Spring基本连接进行连接更为常

我最近接手了一个Spring/JPA/Hibernate/Maven项目,我是JavaEE开发的新手。当这个项目运行时,它依赖于Tomcat来启动,这样它就可以访问数据库。据我所知,这被称为“在Tomcat容器中运行”

我正在尝试让一个简单的集成测试工作,但在让测试成功连接到数据库时遇到了问题。我已经将POM设置为在预集成测试阶段运行Tomcat,这样集成测试就可以准确地连接到数据库,而实际应用程序是如何连接的


这是正确的方法,还是在测试应用程序上下文中通过某种Spring基本连接进行连接更为常见?任何能为我的spring测试上下文发布一些有效的数据库连接代码的人都将是我的英雄,因为我在网上找到的示例中没有任何运气。

如果您使用下一个技术堆栈开发web应用程序:JSP/Servlets+spring+Hibernate 您不必担心web容器的实现。 在一个完美的世界中,由于JavaWebContainer的规范,所有web容器的行为都是相同的,但在现实世界中并非如此。无论如何,这是部署工程师或支持团队的问题,作为开发人员,您可以选择嵌入式模式下的Jetty作为您的测试环境。
顺便说一句:使用
mvnjetty:run
通过maven运行应用程序

对于连接到实际数据库实例的测试来说,这有点反模式。相反,您可以使用DBUnit和内存中的数据库(如HSQL或H2)独立于与“真实”数据库的网络连接来运行测试。

在开发JEE应用程序时,为什么要使用Spring?@PizzaPill:Spring是JEE应用程序的“框架”…@home:从什么时候开始?吉是来替换弹簧的imho@PizzaPill当前位置由于吉的年龄比春天大,如果说有什么不同的话,那就正好相反。但这是一个毫无意义的争论,因为这两个标准并不是100%不同的——JEE是许多单独标准的集合,而Spring影响了其中许多标准的当前版本的设计,并反过来实现了它们。我一直认为Spring是一个轻量级的JEE,在EJB3中实际上已经过时了。显然我错了。所以你会建议我在web容器中运行集成测试,但是使用Jetty而不是Tomcat?是的,如果你测试应用程序(业务层+dao)与数据库或其他资源的集成。同样对于测试来说,看看Unitils——提供集成/单元测试非常有用和简单。谢谢你的回答。关于为什么这是反模式,您能提供一些参考或链接吗?我已经读到,连接到真实的网络是一个好主意database@CFL_Jeff:反模式部分是指在测试期间,您没有明确控制数据库的确切状态(例如,与其他开发人员没有冲突)。您可以将DBUnit设置为使用部署环境的副本。如果您使用特定于特定数据库的sql扩展,最好不要更改。在一个项目中,我使用postgresql进行部署,但针对H2实例进行测试。这确实意味着我不能使用一些在H2中没有复制的postgresql的优秀扩展函数,但我喜欢设置新测试环境的简单性和测试运行的速度。ccoakley陈述了与我相同的大部分原因。我个人在测试中使用真实DB的另一个问题是,如果DB关闭,您不在同一个网络上,您无法访问它,等等,您就无法轻松运行这些测试。我强烈反对,因为这种反模式是用于测试的,而不是用于集成测试。集成测试的思想是测试应用程序是否与生产数据库管理系统一起工作(这并不意味着您应该使用生产数据)。