1

当每个测试都单独执行时,我已经设法让备用描述符与我在 OpenEJB 上运行的单元测试一起使用依赖 EJB 组件的存根。但是一旦我介绍了一个测试套件,部署描述符似乎是从添加到套件中的第一个测试中获取的。

一些代码可以更好地解释它。正在测试的 Bean 类似于

@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

4

1 回答 1

1

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

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


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

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

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

这篇博文展示了如何

于 2011-10-04T17:12:35.027 回答