2013-03-26 65 views
2

我注射SessionContext作为一种资源的EJB(实施容器管理的事务):模拟注入SessionContext

@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。

+0

是的。使用你的模拟框架,并要求它为你创建一个假会话上下文。 – 2013-03-26 08:05:00

回答

1

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

0

为他人谋取利益,这是它是如何在jmockit完成:

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

虽然在我的情况下,没有必要嘲笑getRollbackOnly(这是我在代码中使用),我就是这么做的未来情况下的行为会发生变化。