我将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。
使用jmockit为您创建会话上下文的模拟版本,并使用jmockit的"when…"返回"语句以确保模拟上下文返回您需要的值。
为了他人的利益,jmockit是这样做的:
sessionContextResourceField.set(instance,
new MockUp<SessionContext>() {
@Mock boolean getRollbackOnly() { return false; }
}.getMockInstance());
虽然在我的情况下没有必要Mock getRollbackOnly(我在代码中使用),但我还是这样做了,以防将来行为发生变化。