【问题标题】:How do I mock a SessionContext injected via @Resource in Java-EE?如何在 Java-EE 中模拟通过 @Resource 注入的 SessionContext?
【发布时间】:2015-09-21 13:01:08
【问题描述】:

我收到以下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
}

【问题讨论】:

  • 我尝试了抑制和模拟,不起作用,抑制(field(FacadeBean.class, "context"));

标签: java jakarta-ee junit mockito


【解决方案1】:

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

换句话说,在你真正的课堂上,改变这个:

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

【讨论】:

  • 现在我没有修改现有代码的范围,只写JUnit/mockito而不修改现有代码。请建议我是否可以禁止该字段?
  • @Durron597,根据例子,beanObject 代表什么?
猜你喜欢
  • 2013-03-15
  • 1970-01-01
  • 2012-09-06
  • 2020-10-08
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
相关资源
最近更新 更多