测试Spring托管的servlet

时间:2014-04-10 10:59:24

标签: java spring servlets spring-test

我需要测试一个servlet,现在工作正常。

servlet需要使用Spring服务,因此以这种方式对其进行修改:

SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(
    this, config.getServletContext()); // ImageServlet.java line 49

迁移到Spring 4后,测试破了,目前它抛出了这个异常:

java.lang.IllegalStateException:
No WebApplicationContext found: no ContextLoaderListener registered?
at org.springframework.web.context.support.WebApplicationContextUtils.
    getRequiredWebApplicationContext(WebApplicationContextUtils.java:84)
at org.springframework.web.context.support.SpringBeanAutowiringSupport.
    processInjectionBasedOnServletContext(SpringBeanAutowiringSupport.java:107)
at package.ImageServlet.init(ImageServlet.java:49)
at in.nasv.utils.ImageServletTest.accessingImageViaHttp(ImageServletTest.java:45)

以下是ImageServletTest的代码部分:

// prepare servlet instance
MockServletConfig config = new MockServletConfig(
    new MockServletContextPatched());
ImageServlet servlet = new ImageServlet();
servlet.init( config ); // ImageServletTest, line 45

这个修补过的课程(现在实际上没有修补):

public class MockServletContextPatched extends MockServletContext{ }

我应该做些什么来避免这种情况“IllegalStateException:找不到WebApplicationContext:没有注册ContextLoaderListener?” ?

2 个答案:

答案 0 :(得分:0)

我找到了解决方案。但足够清楚,但一个解决方案。

现在servlet初始化是:

MockServletContext servletContext = new MockServletContextPatched();
MockServletConfig config = new MockServletConfig( servletContext );
ImageServlet servlet = new ImageServlet();

ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext( "spring-data-app-context.xml" );
DefaultListableBeanFactory dlbf = new DefaultListableBeanFactory(appContext.getBeanFactory());
GenericWebApplicationContext gwac = new GenericWebApplicationContext(dlbf);        
servletContext.setAttribute(GenericWebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, gwac);
gwac.setServletContext(servletContext);
gwac.refresh();

servlet.init( config );

以标准方式准备请求和响应:

MockHttpServletResponse response = new MockHttpServletResponse();

URL serverUrl = new URL( propertyExtendedService.getServerAddress(true) );
MockHttpServletRequest request = new MockHttpServletRequest();
request.setRequestURI( "/what-you-want" );
request.setPathInfo( "/" + TEST_IMAGE );
request.setContentType("image/jpeg");
request.addHeader("Accept", "image/jpeg;image/jpg;" );

最后一步是调用过滤器并断言返回的值:

servlet.doGet( request, response );
assertEquals( response.getStatus(), 200 );
// assert everything you want

答案 1 :(得分:0)

更新updated documentation for getServletContext()现已上线。


没有必要仅在Spring的MockServletContextPatched中配置自定义MIME类型来实现自定义MockServletContext类。

由于Spring的MockServletContext使用Java Activation Framework(JAF)来实现ServletContext.getMimeType(String)方法,因此通过JAF的MimetypesFileTypeMap.addMimeTypes(String)方法配置自定义MIME类型非常容易,如下所示。 / p>

MockServletContext mockServletContext = new MockServletContext();
MimetypesFileTypeMap mimetypesFileTypeMap =
    (MimetypesFileTypeMap) MimetypesFileTypeMap.getDefaultFileTypeMap();
mimetypesFileTypeMap.addMimeTypes("text/enigma    enigma");
assertEquals("text/enigma", mockServletContext.getMimeType("filename.enigma"));

在上面基于JUnit的测试代码中,我为扩展名为"text/enigma"的文件配置了自定义MIME类型.enigma

希望这有帮助!

此致

Sam(Spring TestContext Framework的作者)

P.S。我创建了JIRA问题SPR-12126,以便改进MockServletContext的文档。