2

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

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

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

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

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

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

4

2 回答 2

1

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

于 2013-03-26T08:28:11.253 回答
0

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

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

尽管在我的情况下没有必要模拟 getRollbackOnly (我在代码中使用),但我还是这样做了,以防将来行为发生变化。

于 2013-03-26T18:21:22.790 回答