Java 测试Spring托管servlet
我需要测试一个servlet,它现在运行良好 servlet需要使用Spring服务,因此对其进行了如下修改:Java 测试Spring托管servlet,java,spring,servlets,spring-test,Java,Spring,Servlets,Spring Test,我需要测试一个servlet,它现在运行良好 servlet需要使用Spring服务,因此对其进行了如下修改: SpringBeanAutowiringSupport.processInjectionBasedOnServletContext( this, config.getServletContext()); // ImageServlet.java line 49 迁移到Spring 4后,测试中断,当前抛出此异常: java.lang.IllegalStateException
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{ }
我该怎么做才能避免这个非法状态例外:找不到WebApplicationContext:没有注册ContextLoaderListener 我找到了解决办法。但是足够清楚,但是一个解决方案 现在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
更新:现在在线
仅仅为了在Spring的MockServletContext中配置自定义MIME类型,不需要实现自定义MockServletContextPatched类
由于Spring的MockServletContext使用Java激活框架JAF实现ServletContext.getMimeTypeString方法,因此通过JAF的MimetypesFileTypeMap.AddMimetypeString方法配置自定义MIME类型非常容易,如下所示
MockServletContext mockServletContext = new MockServletContext();
MimetypesFileTypeMap mimetypesFileTypeMap =
(MimetypesFileTypeMap) MimetypesFileTypeMap.getDefaultFileTypeMap();
mimetypesFileTypeMap.addMimeTypes("text/enigma enigma");
assertEquals("text/enigma", mockServletContext.getMimeType("filename.enigma"));
在上面基于JUnit的测试代码中,我为扩展名为.enigma的文件配置了自定义MIME类型text/enigma
希望这有帮助
问候,
Sam是SpringTestContext框架的作者
p、 我创建JIRA问题是为了改进MockServletContext的文档。您真的需要调用init方法来测试您的Servlet吗?如果不是,我建议您只是实例化Servlet并手动注入其依赖项,而不是在测试中依赖SpringBeanAutowiringSupport。很好的方法,但它不适用于我的情况。Spring MockServletContext的功能非常有限,没有setter和getter只返回固定值,dummy Spring!所以我需要扩展它。我只能通过initSpring的MockServletContext使用setter来应用它。你认为Spring的MoCsServices上下文中有什么局限性?自定义MockServletContextPatched有什么特别之处?我需要MimeType的setter,但只有getter存在。我的MockServletContextPatched扩展了这一点。是的,MockServletContext有3个额外的setter,但其他许多setter对Spring的mock类的功能没有限制。MockServletContext中没有用于MIME类型的setter方法,因为Spring使用Java激活框架解析传递到getMimeTypeString的文件名的MIME类型。如果您需要设置Java激活框架不支持的自定义MIME类型的方法,请针对“Spring Framework”项目和“Test”组件创建一个新的JIRA问题以请求该功能。您绝对不应该加载两个ApplicationContexts。一个就够了。此外,SpringTestContext框架已经为您的WebApplicationContext设置了测试基础设施,包括MockServletContext、MockHttpServletRequest和MockHttpServletResponse。你看了吗?请参阅和了解详细信息。嗨,山姆。谢谢你为我的解决方案。抱歉,我删除了这个测试,所有旧的servlet功能都被删除了,所以它的测试也被删除了,所以我可以测试它。你的方法似乎很优雅。但是…但是我不确定它是否更好。大多数开发人员都会寻找一个setter,因为常见的双重测试很简单,并且带有硬编码的值。另一个原因是JAF似乎并不广为人知,所以可能会跳过MimetypesFileTypeMap。但这是我的观点,我可能错了。同样是10倍的溶液。