0

久违了,我又回到了 Java EE,所以我基本上不得不从头开始学习现代 EE。作为这项努力的一部分,我正在尝试边做边学。我有一个功能性沙箱可供使用——一个简单的应用程序,其中前端由一个 EJB 通过 JPA 与数据库通信提供支持。

为了帮助我学习,我正在尝试设置一些 JUnit 测试。不幸的是,它们不起作用,而且由于我在很多方面都没有超出“猴子看,猴子做”阶段,所以我很难解决我看到的问题。

以下是我为测试 MyEJB 而设置的代码,它被定义为@Statelessand @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:没有可用的 EJBContainer 提供程序:没有找到提供程序名称。

我该如何解决?还是我的方法从根本上是错误的?

4

1 回答 1

4

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

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

于 2012-11-27T10:02:42.623 回答