模拟注入了SessionContext

时间:2013-03-26 02:33:48

标签: java junit dependency-injection ejb-3.0 sessioncontext

我将SessionContext作为资源注入EJB(实现容器管理的事务):

@Stateless(name = "XXX", mappedName = "PPP-MMM-CCC")
@TransactionManagement(value=TransactionManagementType.CONTAINER)
public class Xxx implements ItsRemoteInterface {
   @Resource
   private SessionContext sctx;
   ....
}

我的单元测试失败,因为“sctx”在运行时为空( NullPointerException )。因此,我想要解决的唯一方法是创建一个FakeSessionContext类来实现SessionContext,然后我可以在测试期间使用它。

instance = new Xxx();
sessionContextResourceField = Xxx.class.getDeclaredField("sctx");
sessionContextResourceField.setAccessible(true);
sessionContextResourceField.set(instance, new FakeInitialContext());

但在我这样做之前,我想知道是否有更优雅的方式?除了创建一个FakeSessionContext类?像工厂一样的东西?

如果有兴趣,我使用的是jUnit 4.10和jmockit 0.999.15。

2 个答案:

答案 0 :(得分:1)

使用jmockit为您创建会话上下文的模拟版本,并使用jmockit的“when ... return”语句版本来确保模拟上下文返回您需要的值。

答案 1 :(得分:0)

为了他人的利益,这就是在jmockit中完成的方式:

sessionContextResourceField.set(instance, 
            new MockUp<SessionContext>() {
                @Mock boolean getRollbackOnly() { return false; }
            }.getMockInstance());

虽然在我的情况下没有必要模拟getRollbackOnly(我在代码中使用),但无论如何我都会这样做以防将来行为发生变化。