首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟注入SessionContext

模拟注入SessionContext
EN

Stack Overflow用户
提问于 2013-03-26 02:33:47
回答 2查看 2.5K关注 0票数 2

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

代码语言:javascript
复制
@Stateless(name = "XXX", mappedName = "PPP-MMM-CCC")
@TransactionManagement(value=TransactionManagementType.CONTAINER)
public class Xxx implements ItsRemoteInterface {
   @Resource
   private SessionContext sctx;
   ....
}

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

代码语言:javascript
复制
instance = new Xxx();
sessionContextResourceField = Xxx.class.getDeclaredField("sctx");
sessionContextResourceField.setAccessible(true);
sessionContextResourceField.set(instance, new FakeInitialContext());

但在我这么做之前,我想知道是否有一种更优雅的方式?除了创建一个FakeSessionContext类之外?就像工厂里的那种?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-26 08:28:11

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

票数 1
EN

Stack Overflow用户

发布于 2013-03-26 18:21:22

为了其他人的利益,在jmockit中就是这样做的:

代码语言:javascript
复制
sessionContextResourceField.set(instance, 
            new MockUp<SessionContext>() {
                @Mock boolean getRollbackOnly() { return false; }
            }.getMockInstance());

虽然在我的例子中,不需要伪装getRollbackOnly (我在代码中使用),但我还是这么做了,以防将来行为发生变化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15628354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档