单元测试依赖于Spring的WebApplicationContextUtils.getRequiredWebApplicationContext(context)的Servlet

时间:2011-12-11 14:59:01

标签: java spring unit-testing servlets applicationcontext

我想在其WebApplicationContextUtils.getRequiredWebApplicationContext(context)方法中对依赖于Spring init()的servlet代码进行单元测试。

以下是代码的一部分:

@Override
public void init() throws ServletException {
super.init();
WebApplicationContext applicationContext =
    WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
this.injectedServiceBean = (SomeService) applicationContext.getBean("someBean");
}

将适当的applicationContext.xml(测试版本)注入此文本的最佳方法是什么?

我知道Spring的@ContextConfiguration,但我不确定将该注释加载到{servlet上下文中的${testClass}Test-context.xml上下文的最佳方法,以便getRequiredWebApplicationContext (...)可以退货。

1 个答案:

答案 0 :(得分:9)

您可以通过以下方式注入应用程序上下文:

getServletContext().setAttribute(
  WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,
  testApplicationContext
);

这是有效的,因为WebApplicationContextUtils使用ServletContext键(org.springframework.web.context.WebApplicationContext.ROOT常量)提取存储在WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE中的对象。

这只表明直接从应用程序上下文中提取bean是有问题的,因为这种方法不遵循DI规则。如果可以,请尝试重构此servlet以更好地与Spring集成(例如,使用HttpRequestHandlerServlet see example)。