我需要测试一个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?” ?
答案 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
的文档。