【问题标题】:Mock injected SessionContext模拟注入的 SessionContext
【发布时间】:2013-03-15 17:36:53
【问题描述】:

我将 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。

【问题讨论】:

  • 是的。使用您的模拟框架并要求它为您创建一个虚假的会话上下文。

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多