当我们自己执行每个测试时,我已经设法使用备用描述符来使用在依赖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
答案 0 :(得分:1)
根据日志输出,容器实际上仅在第一次测试时启动一次,因为大约需要。执行时间为2.5秒,而其他时间约为0,001秒。
正如您所注意到的,初始化只发生一次。
@RunWith(Suite.class)
@Suite.SuiteClasses({
ABeanTest.class,
BBeanTest.class
})
因此,在这种情况下,ABeanTest和BBeanTest都在同一容器实例中运行,具有与ABeanTest设置的相同的初始上下文属性。
在您的情况下,由于您需要对两个测试类进行不同的设置,我认为在ABeanTest @AfterClass中转储容器实例并在BBeanTest中使用新的容器实例应该这样做。
This blog post显示了如何