Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试Spring托管servlet_Java_Spring_Servlets_Spring Test - Fatal编程技术网

Java 测试Spring托管servlet

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

我需要测试一个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{ }

我该怎么做才能避免这个非法状态例外:找不到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倍的溶液。