Java 使用jUnit测试套件时,OpenEJB替代描述符无法工作

Java 使用jUnit测试套件时,OpenEJB替代描述符无法工作,java,junit,ejb,junit4,openejb,Java,Junit,Ejb,Junit4,Openejb,当每个测试都独立执行时,我已经设法使用替代描述符来处理在OpenEJB上运行的单元测试,这些测试使用独立EJB组件的存根。但一旦我介绍了一个测试套件,部署描述符似乎就取自添加到套件中的第一个测试 一些代码可以更好地解释它。测试中的豆子有点像 @Stateless @Local(A.class) public class ABean implements A { // Bean implementation, no dependencies } @Stateless @Local(B

当每个测试都独立执行时,我已经设法使用替代描述符来处理在OpenEJB上运行的单元测试,这些测试使用独立EJB组件的存根。但一旦我介绍了一个测试套件,部署描述符似乎就取自添加到套件中的第一个测试

一些代码可以更好地解释它。测试中的豆子有点像

@Stateless
@Local(A.class)
public class ABean implements A {
     // Bean implementation, no dependencies
}


@Stateless
@Local(B.class)
public class BBean implements B {

     @EJB
     A aBean;  // Dependency to ABean

     // Rest of the implementation
}
和B的testcase(A的testcase类似,只是它没有设置使用备用描述符的属性)

如前所述,当单独执行时,这一切都很好。替代描述符注入接口的存根实现

当使用下面的测试套件时,事情开始分崩离析

 @RunWith(Suite.class)
 @Suite.SuiteClasses({
   ABeanTest.class, 
   BBeanTest.class
 })
 public class MySuite {
      // Empty on purpose, annotations do the trick
 }
运行此套件时,不使用测试B的备用描述符。尽管如此,输出显示至少在每次测试之前设置了属性

 boot A: {java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory}
 boot A: {java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory}
 boot A: {java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory}
 boot B: {java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory, openejb.altdd.prefix=test}
 boot B: {java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory, openejb.altdd.prefix=test}
如果我颠倒将测试加载到suite的顺序,即在ABeanTest.class之前添加BBeanTest.class,它将使用备用描述符。由于ABean没有依赖项,因此在这种情况下可以正常工作,但可能会导致具有多个备用描述符的较大设置出现问题

有什么建议吗

提前谢谢

编辑根据日志输出,容器在第一次测试中实际上只启动一次,因为执行该测试大约需要2,5秒,而其他测试大约需要0001秒

EDIT2OpenEJB版本是ApacheOpenEJB 3.1.4版本:20101112-03:32

根据日志输出,第一次测试实际上只引导容器一次,因为执行大约需要2,5秒,而其他测试大约需要0001秒

正如您正确地注意到的,初始化只发生一次


@RunWith(Suite.class)
 @Suite.SuiteClasses({
   ABeanTest.class, 
   BBeanTest.class
 })
因此,在本例中,ABeanTest和BBeanTest都在同一个容器实例中运行,其初始上下文属性与ABeanTest设置的相同

在您的例子中,由于两个测试类需要不同的设置,我认为在ABeanTest@AfterClass中转储容器实例并在BBeanTest中使用一个新实例就可以了

显示如何

根据日志输出,第一次测试实际上只引导容器一次,因为执行大约需要2,5秒,而其他测试大约需要0001秒

正如您正确地注意到的,初始化只发生一次


@RunWith(Suite.class)
 @Suite.SuiteClasses({
   ABeanTest.class, 
   BBeanTest.class
 })
因此,在本例中,ABeanTest和BBeanTest都在同一个容器实例中运行,其初始上下文属性与ABeanTest设置的相同

在您的例子中,由于两个测试类需要不同的设置,我认为在ABeanTest@AfterClass中转储容器实例并在BBeanTest中使用一个新实例就可以了


显示了我如何在batchtest jUnit ANT任务的帮助下完成所需的工作。在“套件”可以通过包名来区分的情况下,它可以很好地工作。它仍然需要知道是否可以将jUnit TestSuite与OpenEJB一起使用,以便在需要时创建更复杂的套件。在“套件”可以通过包名来区分的情况下,它可以很好地工作。它仍然需要知道是否可以将jUnit TestSuite与OpenEJB一起使用,以便在需要时创建更复杂的套件。谢谢@stratwine。您链接的博客文章清楚地解释了如何在测试之间关闭容器。仅仅调用Context#close()是不够的。还需要将值为“destroy”的属性“openejb.embedded.initialcontext.close”在创建后传递给initialcontext。谢谢@stratwine。您链接的博客文章清楚地解释了如何在测试之间关闭容器。仅仅调用Context#close()是不够的。创建属性“openejb.embedded.initialcontext.close”后,还需要将其值为“destroy”的属性“openejb.embedded.initialcontext.close”传递给initialcontext。