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(這是我在代碼中使用),我就是這麼做的未來情況下的行爲會發生變化。