如何编写可以看到我的EJB服务的JUnit测试?

时间:2012-06-21 17:55:26

标签: java-ee junit ejb

我有一个在WebSphere 7上运行的Java EE应用程序(使用IBM RAD 7.5 / Eclipse)。

它基本上是user.JSP - > UserServlet - > @Stateless UserService - > UserDAO - >甲骨文

我想为UserService编写一些JUnit测试。

我从Eclipse中启动应用程序,它在WebSphere上运行。我在Eclipse中的一个新Java项目中进行了JUnit测试。我的问题是,我的JUnit测试如何访问对UserService的引用?

有没有办法让我做一些像@EJB注释的事情:

public class UserTests extends TestCase {

  @EJB  
  private UserServiceLocal userService;

  public void test1() throws Exception {
    Assert.assertTrue("userService is not null", (userService != null));
  }

}

以下是我的UserService的基本版本:

@Stateless
public class UserService implements UserServiceLocal {

  @EJB
  private UserDAOLocal userDAO;

  /* ... */
}

注意:@EJB不会注入任何东西。

注意:userService = (UserServiceLocal)new InitiatContext().lookup(UserServiceLocal.JNDI);也不起作用,说,“NamingManager.getURLContext无法找到此方案的工厂:ejblocal”

@Local
public class interface UserServiceLocal {

  public static final String JNDI = "ejblocal:com.myapp.service.UserServiceLocal";

  /* ... */
}

非常感谢任何建议!

罗布

3 个答案:

答案 0 :(得分:3)

请使用嵌入式容器解决您的问题,或考虑使用Arquilian来完成此任务。 Arquillian将允许您动态构建“Java EE部署”(即 - 通过代码)并使用Arquilian将其部署到您的应用程序服务器,这样您就可以运行JUnit,并在您的服务器上实际运行代码通过你的JUnit测试。

答案 1 :(得分:1)

在一天结束时,我的解决方案是我为要从JUnit测试的EJB添加了一个远程EJB接口。

我创建了一个新的“应用程序客户端项目”并将我的JUnit测试放在那里。我的JUnit测试执行EJB的远程查找。似乎工作正常。

但是,使用WebSphere 7,我必须使用createEJBStubs命令来生成所需的存根。更多细节在这里和这里:

http://www-01.ibm.com/support/docview.wss?uid=swg21393419

http://pic.dhe.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=%2Fcom.ibm.websphere.express.doc%2Finfo%2Fexp%2Fae%2Frejb_3stubscmd.html

答案 2 :(得分:0)

我为createEJBStub脚本创建了一个maven-plugin wrapper

<强>为什么吗

这允许我们构建测试maven项目,这些项目在部署后针对我们的应用程序作为CI设置的一部分运行。

更具体地说,与maven一起,这允许我们的测试项目:

  1. 利用Maven依赖关系管理将我们发布的API jar拉到我们的内部nexus存储库
  2. 创建Stub类作为“generate-sources”maven生命周期的一部分
  3. 使用EJB对应用服务器运行junit测试用例以进行集成测试。