你如何对Java EE代码进行单元测试?

25

我想问一下你在测试Java EE代码时的首选方式是什么?

我只发现了三个项目,它们试图帮助在Java EE环境中编写单元测试:

所以我想知道:

  • 是否有任何框架可以帮助编写Java EE代码的(j)unit测试?
  • 你使用嵌入式Java EE服务器,例如jboss或glassfish v3吗?
  • 你自己模拟和注入吗?

非常感谢...


请参阅 https://dev59.com/2XI-5IYBdhLWcg3wq6Zo,以获取有关 EJB 和 J2EE 的良好单元测试资源。 - ewernli
另一个过时的项目:http://sourceforge.net/projects/mockejb/ 最后发布日期:2004年9月4日 - marabol
1
有一篇2011年的文章,作者是Adam Bien,关于JavaEE单元测试的。文章链接在这里:http://www.oracle.com/technetwork/articles/java/unittesting-455385.html。 - Martin Schröder
4个回答

24
如果你指的是"单元测试"(对单个单元进行测试),则实际上不需要特定的框架,因为EJB3.0只是带注释的POJO,因此可以相对容易地进行测试。但如果你指的是其他内容,比如"集成测试"或"功能测试",那么工具可以帮助并简化这些事情。JUnitEE似乎已经过时了,而且我甚至不确定它是否适用于EJB3.x。CactusJava EE 5支持也没什么印象,部署Cactus测试非常麻烦(我认为Cactus对J2EE 1.4来说很不错,但现在有些过时了)。因此,Ejb3Unit是我认为最好的选择,特别是如果你想运行容器外测试,即不真正部署应用程序(速度更快)。
如果您想进行容器化测试,您可以使用内嵌容器。目前我更倾向于GlassFish v3,即使是针对Java EE 5。请参考GlassFish Embedded Reloaded, an appserver in your pocket以获取示例代码(用于您的测试),或者Using maven plugin for v3 embedded glassfish(如果您正在使用maven)。
另一种选择是使用Cargo打包和部署应用程序,然后针对已部署的应用程序运行一些测试(例如使用Selenium或BDD工具)。如果您想要在不提供任何内嵌API的容器中运行端到端测试,则此选项可能很有用。
因此,回答您的最后一个问题,对于非单元测试且不需要模拟/注入内容的测试,我确实会使用可用的工具,甚至可能结合使用。

我听说Cactus项目有了新的主要开发人员Petar Tahchiev,重新焕发生机。JSFUnit是基于Cactus的。 - cetnar
@cetnar 哦,好的,知道了! 实际上,我可能过于专注于EJB3而完全忘记了JSF。 非常感谢您提供这些信息。 - Pascal Thivent
非常感谢。我想为所有的EJB pojos创建构造函数,以允许注入而不需要任何反射。Cargo对于集成测试非常有趣。谢谢! - marabol
有没有针对 JMS、TimerService 和 SessionContext 的简单模拟/仿真工具? - marabol
2
因此,它可以相对容易地进行测试,无需任何特殊的装置。但是排除具有@PersistenceContext EntityManager 的 EJBs? - Raedwald
@PascalThivent:“2011/08/05 - Jakarta Cactus已经被淘汰。” - Martin Schröder

2
我一直面临着在Java EE 6容器(确切地说是Glassfish v3)中基于JUnit运行集成测试的相同问题,经过大量浏览和搜索,我找不到真正适合我的需求的解决方案,所以我编写了自己的解决方案,现在发布在Google Code上,称为jeeunit
我不会称它为一个测试框架,它实际上只是提供了几个类,用于将JUnit和嵌入式Glassfish之间进行连接。
总体思路类似于Cactus,您的测试在容器中运行,并由外部的Servlet触发。
jeeunit支持JUnit 4、Glassfish v3、CDI,并生成标准的XML JUnit报告,就像Ant或Maven Surefire一样(实际上,我重用了一些Ant的代码来生成报告)。

2

由于您对单元测试感兴趣,我建议使用JUnit。您可以对核心类中的方法进行单元测试。如果您在使用JUnit编写单元测试用例时遇到困难,则可能设计不是模块化的,并且高度耦合。首先专注于您的核心功能并使用JUnit进行测试。


2
我有一个测试CDI应用程序的需求,并编写了一个自定义的JUnit运行器,可以在Web容器之外运行所有内容。
它适用于Java SE,并支持虚拟请求、会话和对话范围,以测试Web应用程序。
这很小而快速,在您有大量单元测试时非常棒。 http://jglue.org/cdi-unit/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接