如何模拟在Java-EE中通过@Resource注入的SessionContext



我得到以下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");        
  }
}
测试类

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

最简单的方法是将类更改为使用方法注入而不是字段注入

换句话说,在实际的类中,更改这个:

@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问题;如果发生这种情况,请阅读这个问题:使用@Resource注释注入SessionContext


如果你不能改变代码,你可以通过反射来访问这个字段,像这样做:

@Before
public void setUp() {
  Field sessionContextField = FacadeBean.class.getDeclaredField("context");
  sessionContextField.setAccessible(true);
  sessionContextField.set(beanObject, mock(SessionContext.class));
}

相关内容

  • 没有找到相关文章

最新更新