如何在集成测试(OpenEjb)中测试有状态会话bean的钝化?

Syl*_*lar 2 java ejb openejb ejb-3.0

我在集成测试中使用OpenEjb本地服务器(3.1.4)(@LocalClient注释测试类).

@LocalClient
public class BoxDaoTest{

    @EJB
    private BoxDao boxDao;
    ...
}
Run Code Online (Sandbox Code Playgroud)

BoxDao是一个有状态的会话bean.是否有可能在OpenEjb中触发BoxDao的钝化以在集成测试中对其进行测试?

Dav*_*ins 5

您可以InitialContext在测试用例中用于引导OpenEJB 的属性中创建/配置Stateful容器.

这些设置可以解决这个问题:

final Properties p = new Properties();
p.put("MyStatefulContainer", "new://Container?type=STATEFUL");
p.put("MyStatefulContainer.Capacity", "0");
p.put("MyStatefulContainer.Frequency", "0");

p.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.core.LocalInitialContextFactory");
final InitialContext initialContext = new InitialContext(properties);
//lookup your beans from the initialContext
Run Code Online (Sandbox Code Playgroud)

这将导致@Statefulbean基本上永远不会驻留在内存中,它将从磁盘读取并在每次方法调用或生命周期回调时写回磁​​盘.

使用EJB 3.1 javax.ejb.embeddable.EJBContainerAPI 可以完成同样的事情:

final Properties p = new Properties();
p.put("MyStatefulContainer", "new://Container?type=STATEFUL");
p.put("MyStatefulContainer.Capacity", "0");
p.put("MyStatefulContainer.Frequency", "0");

final EJBContainer container = EJBContainer.createEJBContainer(p);
Foo foo = (Foo) container.getContext().lookup("java:global/yourapp/yourbean");
Run Code Online (Sandbox Code Playgroud)