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

时间:2011-09-27 21:10:23

标签: java junit ejb junit4 openejb

当我们自己执行每个测试时,我已经设法使用备用描述符来使用在依赖EJB组件的存根上运行在OpenEJB上的单元测试。但是,一旦我引入了测试套件,似乎部署描述符取自添加到套件中的第一个测试。

一些代码可以更好地解释它。被测豆类就像

@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的测试用例(A的测试用例类似,但它没有设置使用备用描述符的属性)

public class BBeanTest {
    private B bean;

    @Before
    public void bootContainer() throws Exception {
        Properties props = new Properties();
        props.put(Context.INITIAL_CONTEXT_FACTORY,
               "org.apache.openejb.client.LocalInitialContextFactory");
        props.put("openejb.altdd.prefix", "test");  // Use stubs

        System.out.println("boot B: " + props);

        context = new InitialContext(props);
        bean = (B) context.lookup("BBeanLocal");
    } 
}

如上所述,这一切在单独执行时效果很好。备用描述符注入A接口的存根实现。

使用以下测试套件时,事情开始崩溃。

 @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}

如果我颠倒了将测试加载到套件的顺序,即在ABeanTest.class之前添加BBeanTest.class,它将使用备用描述符。由于ABean没有依赖关系,这在这种情况下可以正常工作,但可能会导致使用多个备用描述符的更大设置出现问题。

任何指针?

提前致谢。

编辑根据日志输出,容器实际上仅在第一次测试时启动一次,因为大约需要。执行时间为2.5秒,而其他时间约为0,001秒。

EDIT2 OpenEJB版本 Apache OpenEJB 3.1.4 build:20101112-03:32

1 个答案:

答案 0 :(得分:1)

  

根据日志输出,容器实际上仅在第一次测试时启动一次,因为大约需要。执行时间为2.5秒,而其他时间约为0,001秒。

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


@RunWith(Suite.class)
 @Suite.SuiteClasses({
   ABeanTest.class, 
   BBeanTest.class
 })

因此,在这种情况下,ABeanTest和BBeanTest都在同一容器实例中运行,具有与ABeanTest设置的相同的初始上下文属性。

在您的情况下,由于您需要对两个测试类进行不同的设置,我认为在ABeanTest @AfterClass中转储容器实例并在BBeanTest中使用新的容器实例应该这样做。

This blog post显示了如何