gpt4 book ai didi

java - 如何在 Java-EE 中模拟通过 @Resource 注入(inject)的 SessionContext?

转载 作者:行者123 更新时间:2023-11-30 08:46:57 36 4
gpt4 key购买 nike

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

最佳答案

最简单的方法是更改​​类以使用 method injection而不是场注入(inject)

换句话说,在你的真实类里面,改变这个:

@Resource
private SessionContext context;

进入这个:

private SessionContext context;

@Resource
public void setSessionContext(SessionContext sessionContext) {
this.sessionContext = sessionContext;
}

然后,完成后,您可以使用单元测试注入(inject)模拟:

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

关于java - 如何在 Java-EE 中模拟通过 @Resource 注入(inject)的 SessionContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32695925/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com