如何在 Java-EE 中模拟通过 @Resource 注入的 SessionContext?
How do I mock a SessionContext injected via @Resource in Java-EE?
我得到以下 NullPointerException
:
Caused by: java.lang.NullPointerException at FacadeBean.createRegistration(FacadeBean.java:389)
在FacadeBean.java
之下:
private SessionContext context
public CreateRegistrationResponse createRegistration() {
try {
// snip
} catch (DataAccessException de){
context.setRollbackOnly(); //---------line 389
throw new ServiceException("Error");
}
}
测试class
@Test(expected = ServiceException.class)
public void testCreateRegistrationError() throws ServiceException {
doThrow(DataAccessException.class).when(mockRegistrationPeristenceImpl).create(any(Registration.class));
facadeBeanTest.createRegistration(RegistrationFacadeMock.getCreateRegistrationRequest());
}
谁能告诉我如何模拟下面的行,这样我就可以忽略它 context.setRollbackOnly();
public class FacadeBean {
public FacadeBean() {}
@Resource
private SessionContext context
}
最简单的方法是将 class 更改为使用 method injection 而不是 字段注入。
换句话说,在你的真实 class 中,更改为:
@Resource
private SessionContext context;
进入这个:
private SessionContext context;
@Resource
public void setSessionContext(SessionContext sessionContext) {
this.sessionContext = sessionContext;
}
然后,完成后,您可以使用单元测试注入模拟:
@Before
public void setUp() {
// You probably have other code here already
facadeBean.setSessionContext(mock(SessionContext.class));
}
不过,如果您这样做,您可能会遇到 JAXB 问题;如果发生这种情况,请阅读这个问题:SessionContext Injection using @Resource annotation
如果您不能更改代码,您可能可以通过反射访问该字段,执行如下操作:
@Before
public void setUp() {
Field sessionContextField = FacadeBean.class.getDeclaredField("context");
sessionContextField.setAccessible(true);
sessionContextField.set(beanObject, mock(SessionContext.class));
}
我得到以下 NullPointerException
:
Caused by: java.lang.NullPointerException at FacadeBean.createRegistration(FacadeBean.java:389)
在FacadeBean.java
之下:
private SessionContext context
public CreateRegistrationResponse createRegistration() {
try {
// snip
} catch (DataAccessException de){
context.setRollbackOnly(); //---------line 389
throw new ServiceException("Error");
}
}
测试class
@Test(expected = ServiceException.class)
public void testCreateRegistrationError() throws ServiceException {
doThrow(DataAccessException.class).when(mockRegistrationPeristenceImpl).create(any(Registration.class));
facadeBeanTest.createRegistration(RegistrationFacadeMock.getCreateRegistrationRequest());
}
谁能告诉我如何模拟下面的行,这样我就可以忽略它 context.setRollbackOnly();
public class FacadeBean {
public FacadeBean() {}
@Resource
private SessionContext context
}
最简单的方法是将 class 更改为使用 method injection 而不是 字段注入。
换句话说,在你的真实 class 中,更改为:
@Resource
private SessionContext context;
进入这个:
private SessionContext context;
@Resource
public void setSessionContext(SessionContext sessionContext) {
this.sessionContext = sessionContext;
}
然后,完成后,您可以使用单元测试注入模拟:
@Before
public void setUp() {
// You probably have other code here already
facadeBean.setSessionContext(mock(SessionContext.class));
}
不过,如果您这样做,您可能会遇到 JAXB 问题;如果发生这种情况,请阅读这个问题:SessionContext Injection using @Resource annotation
如果您不能更改代码,您可能可以通过反射访问该字段,执行如下操作:
@Before
public void setUp() {
Field sessionContextField = FacadeBean.class.getDeclaredField("context");
sessionContextField.setAccessible(true);
sessionContextField.set(beanObject, mock(SessionContext.class));
}