Java 如何为源代码控制器中自动连接的junit测试用例注入servletcontext
我有一个控制器类,其中servletContext是自动连接的Java 如何为源代码控制器中自动连接的junit测试用例注入servletcontext,java,spring,servlets,junit,Java,Spring,Servlets,Junit,我有一个控制器类,其中servletContext是自动连接的 @Controller public class BaseController { @Autowired private ServletContext servletContext; protected ServletContext getServletContext() { return servletContext; } public Object getBean(String
@Controller
public class BaseController {
@Autowired
private ServletContext servletContext;
protected ServletContext getServletContext() {
return servletContext;
}
public Object getBean(String beanName) {
ApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(this.servletContext);
return appContext.getBean(beanName);
}
}
BaseController
中的getBean()
被扩展它的子类中的许多方法使用
当我试图为子类中的方法执行jUnit测试用例(调用getBean()
)时,我得到了以下错误
java.lang.IllegalArgumentException: ServletContext must not be null
运行junit时无法加载web.xml
有人能帮忙解释一下如何从JUnit设置servlet上下文吗?如果解决方案是MockServletContext
,请提供一个代码片段,说明如何将MockServletContext
注入控制器中的自动连接servletContext
注意:在
BaseController
中没有setServletContext()
您可以使用PowerMock设置servletContext
不是问题的答案,但不应在控制器中使用ApplicationContext。相反,只需将bean注入控制器。@stefan Birkner:我同意。我不应该在控制器中使用ApplicationContext。但它是一个现有的源代码,由于项目限制,现在不应该修改它。但问题是servletcontext在运行jUnit测试用例时将显示为null。所以请让我知道从junit注入servletcontext的步骤。上述方法仅适用于静态字段。但如上面代码所示,servletContext是一个私有的非静态字段。因此,请建议一种从jUnit注入servletContext的方法,源文件中的servletContext是@Autowired private fieldIt用于非静态字段。(这就是第一个参数是对象的原因。)为什么您认为它只适用于静态字段?
WhiteBox.setInternalState(controller, "servletContext", yourServletContext);