当每个测试都单独执行时,我已经设法让备用描述符与我在 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