针对EJB运行JUnit

时间:2012-11-26 20:22:16

标签: java-ee junit

我很久没有回到Java EE,所以我基本上不得不从头开始学习现代EE。作为这项努力的一部分,我正在努力学习。我有一个功能沙箱 - 一个简单的应用程序,前端由EJB支持,通过JPA与数据库通信。

为了帮助我学习,我正在尝试设置一些JUnit测试。不幸的是,他们没有工作,因为我在很多方面都没有超越“猴子看,猴子做”的阶段,我很难解决如何解决我所看到的问题。

以下是我为测试MyEJB而设置的代码,其定义为@Stateless@LocalBean。 (如果重要的话,我正在运行Glassfish / Eclipse。)


public class MyEJBTest {
    private static EJBContainer ejbContainer;

    private MyEJB myEJB; 

    @BeforeClass
    public static void startTheContainer() {
        ejbContainer = EJBContainer.createEJBContainer();
    }

    @Before
    public void lookupABean() throws NamingException {
        Object object = ejbContainer.getContext().lookup("java:global/simple-stateless/MyEJB");

        assertTrue(object instanceof MyEJB);

        myEJB = (MyEJB) object;
    }

    @AfterClass
    public static void stopTheContainer() {
        if (ejbContainer != null) {
            ejbContainer.close();
        }
    }

    @Test
    public void testFind() {
        MyEntity myEntity = myEJB.find(1); 
        assertTrue(myEntity != null);
        assertEquals("First Row's Name", myEntity.getName());
    }

}

当我将其作为JUnit测试运行时,我在startTheContainer()调用中收到此错误:

javax.ejb.EJBException: No EJBContainer provider available: no provider names had been found.

我该如何解决这个问题?或者我的方法在某种程度上是根本错误的?

2 个答案:

答案 0 :(得分:4)

嗯,EJBContainer API要求在类路径上提供EJBContainerProvider SPI实现。对于GlassFish,您需要在类路径中嵌入GlassFish JAR。如果您使用的是Maven,则这些org.glassfish.extras:glassfish-embedded-all:3.1.1是3.1.1嵌入版本的坐标。

也就是说,最好使用Arquillian来管理EJB容器的生命周期。虽然它现在可能不重要,但如果您遇到嵌入式Java EE容器特有的类路径污染问题,它允许您保留将EJB部署到真实容器的选项。

答案 1 :(得分:0)

这不是一个直接的答案。事实上,我不知道如何解决你的特定问题,对不起。如果您对此感到恼火,请告诉我们。

但如果你现在(再次)使用Java EE,我建议删除vanilla JUnit for EJB测试,而不是Arquillian。 Arquillian的一大优势在于它负责打包测试,将其部署在实际服务器上(如果您愿意,可以在emebdded服务器上部署),并在您的实际环境中再次运行测试。

为了帮助您入门,请查看并运行Arquillian showcase中的一些示例。

这可能听起来非常热情,但是我们已经从JUnit切换到Arquillian,大多数测试都是在大约6个月前的简单单元测试之后,并且从那时起就没有回头了。