我很久没有回到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.
我该如何解决这个问题?或者我的方法在某种程度上是根本错误的?
答案 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个月前的简单单元测试之后,并且从那时起就没有回头了。