@ExceptionHandler 不适用于 Spring MVC 3.1 单元测试

2024-02-19

通过在正常 servlet 上下文之外实例化对象,我可以在 Spring MVC 控制器上完成几乎所有单元测试。但我希望能够运行一些测试,以确保我的对象序列化正常工作,正在生成标头等。

为了在 servlet 上下文中运行测试,我创建了一个修改后的上下文文件,以便不构造各种 bean,然后使用 EasyMock 在测试用例中创建这些 bean 的模拟版本。然后,我使用这样的代码调用我的处理程序,并从 MockHttpServletResponse 中获取我需要的大部分内容。

我认为这抓住了它的本质:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "file:root-context.xml",
                                    "file:junit-servlet-context.xml" } )

public class HomeControllerConfigHandlerHttp {
@Autowired
private RequestMappingHandlerAdapter handlerAdapter;

@Autowired
private RequestMappingHandlerMapping handlerMapping;
    ... //miscellaneous setup
public void someTest() throws Exception
{
    MockHttpServletRequest request = new MockHttpServletRequest();
    request.setMethod("GET");
    request.setRequestURI("/config");
    request.addParameter("foo", "bar");
    request.addParameter("device", "oakmont");
    MockHttpServletResponse response = new MockHttpServletResponse();
    Object handler = handlerMapping.getHandler(request).getHandler();
    replay(dblient);
    expect(serviceClient.checkDevice("oakmont")).andReturn( true );
    serviceClient.destroy();
    replay(serviceClient);
    ModelAndView modelAndView = handlerAdapter.handle(request, response, handler);
    String content = new String( response.getContentAsByteArray() );
    Assert.assertEquals(content, "Expected configuration");
    String content_type = response.getHeader("Content-type");
    Assert.assertEquals( content_type, "text/plain");
    int status = response.getStatus();
    Assert.assertEquals(status,  200 );

这符合我的预期,但有一个问题。我使用 @ExceptionHandler 在控制器中进行了很多错误处理。这是在任何处理程序中退出错误情况的简单方法,并且它为我提供了暴露错误的一致方法。

@ExceptionHandler 在正常的 servlet 部署中工作正常,但在这个单元测试模型中,当我抛出异常时它不会被调用。进入 Spring 代码对我来说是一个挑战,我对它很陌生,所以我很快就迷失了。然而,看起来在正常的 servlet 环境中,有一个异常处理程序来查找带注释的处理程序。在 SpringJUnit4ClassRunner 下运行时,异常不会以相同的方式处理。

如果有办法解决这个问题,我愿意这样做。由于缺乏先锋精神,我避免使用 spring-test-mvc,但如果有人告诉我它可以很好地解决这个问题,我会尝试一下。

我的 junit-servlet-context.xml 文件的内容与 Spring Template MVC 向导创建的 servlet-context.xml 文件几乎相同。唯一的区别是添加了一个排除过滤器,用于防止 @Component 实例化,该 @Component 创建了我的控制器使用的一些单例。

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->

<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />

<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />

<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <beans:property name="prefix" value="/WEB-INF/views/" />
    <beans:property name="suffix" value=".jsp" />
</beans:bean>
<context:component-scan base-package="com.cisco.onplus.home.dmz" >
<context:exclude-filter type="regex" expression=".*InitDatabase.*"/>
</context:component-scan>   
</beans:beans>

添加以下类以在上下文中加载 Dispatcher servlet:

public class MockWebApplicationContext extends AbstractContextLoader {

@Override
public ApplicationContext loadContext(MergedContextConfiguration mergedContextConfiguration) throws Exception {
    String[] locations = mergedContextConfiguration.getLocations();
    return loadContext(locations);
}

@Override
public ApplicationContext loadContext(String... locations) throws Exception {

    XmlWebApplicationContext webApplicationContext = new XmlWebApplicationContext();
    webApplicationContext.setConfigLocations(locations);
    webApplicationContext.setServletContext(new MockServletContext(new FileSystemResourceLoader() ) );

    ServletConfig config = new MockServletConfig();
    config.getServletContext().setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, webApplicationContext);

    final DispatcherServlet servlet = new DispatcherServlet(webApplicationContext);

    webApplicationContext.addBeanFactoryPostProcessor(new BeanFactoryPostProcessor() {
        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
            beanFactory.registerResolvableDependency(DispatcherServlet.class, servlet);
        }
    });

    webApplicationContext.refresh();
    servlet.init(config);

    return webApplicationContext;
}

@Override
protected String getResourceSuffix() {
    return ".xml";
}

}

一旦你完成了这个用途

@ContextConfiguration(locations = {"classpath:app-config.xml",loader = MockWebApplicationContext.class)

使用测试类上的 Autowired 注释加载 DispatcherServlet。使用处理它

servlet.service(request,response); 

现在它也应该处理异常流。

但它可能需要 3.1.2。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

@ExceptionHandler 不适用于 Spring MVC 3.1 单元测试 的相关文章

随机推荐

  • JSoup.clean() 不保留相对 URL

    我努力了 Whitelist relaxed Whitelist relaxed preserveRelativeLinks true Whitelist relaxed addProtocols a href http https mai
  • jQuery 检测 cookie 已启用

    我有一个基于 jQuery 的网络应用程序 我的要求相当简单 我想使用 jQuery 来查明用户是否在其 Web 浏览器中启用或禁用了 cookie 我知道有一个可用的插件可用于创建 检索 删除 更新 cookie 但是 有没有办法 jQu
  • 字符串类型不可变的非技术好处

    我想知道从程序员的角度来看 字符串类型不可变的好处 技术优势 在编译器 语言方面 可以概括为 如果类型是不可变的 则更容易进行优化 读here https stackoverflow com questions 2916358 immuta
  • Crypto++ 输出数据长度

    我正在尝试使用 Crypto 库中的 AES 加密 CBC Mode
  • 将 void* 转换为 double

    我正在尝试使用pthread计算库n斐波那契数列其中n可以来自范围0 1000 当我尝试输入我的内容时 我遇到了一个奇怪的错误void to a double 在我的主要部分中 我调用了计算斐波那契函数 pthread create tid
  • Cookie 存在安全风险吗?

    假设我们有一个网站询问用户的姓名 然后 网站将该值存储在 cookie 中 并在下一页上通过 PHP 检索该值并以某种方式使用它 可能该页面将名称显示为文本 用户是否可以修改cookie数据来注入恶意代码 脚本检索 cookie 数据时是否
  • Chrome 浏览器中无法启用静默调试

    我无法在最新更新的 Chrome 浏览器中看到 Chrome 浏览器标志之一 启用静默调试 如果该标志已更改为其他标志 请告诉我 该标志在版本 79 之后被删除 您仍然可以使用命令选项激活它chrome exe silent debugge
  • 获取 mongodb 查询中项目的索引

    我有一个查询 如下所示 function getPage page return db messages aggregate group id subjectID skip page 20 limit 20 说我有一个subjectID我知
  • 使用 SASS 将列表作为单个参数传递给 mixin

    我喜欢用 SASS 制作 mixins 这有助于我实现良好的跨浏览器兼容性 我想制作一个如下所示的 mixin mixin box shadow value box shadow value webkit box shadow value
  • 如何使用 bean 的属性格式化字符串

    我想使用某种格式创建一个字符串 用 bean 的属性替换格式中的一些标记 是否有支持此功能的库 或者我是否必须创建自己的实现 让我用一个例子来演示一下 说我有一颗豆子Person public class Person private St
  • 使用 subprocess.Popen 的单元测试 Python 代码

    我有一个 Python 项目 在其中读取外部文件 处理它们 并将结果写入新文件 输入文件可以直接读取 也可以使用以下命令从 git 存储库中提取git show 要调用的函数git show并返回标准输出如下所示 def git show
  • 如何让 VSCode 识别当前包 Javascript 导入?

    当我导入像这样的 javascript 函数时 VSCode 智能感知很棒 import func from file vs code 会给我一个有用的对话框 其中包含来自 jsdoc 的参数 这是因为我使用的是相对文件路径 但是 如果我正
  • 如何在 Spring MVC 中将请求映射到 HTML 文件?

    基本配置文件看起来不直观 如果我创建简单的 hello world 示例 然后重命名home jsp to home html并编辑servlet context xml文件来自
  • Eclipse:JDK 9+ 不支持 clientBuilder.sslSocketFactory

    我在 Eclipseoxygen 4 7 0 java 1 8 上收到此错误 JDK 9 不支持 clientBuilder sslSocketFactory 与 Eclipse maven 相关 尝试更新 Maven Alt f5 模块
  • 如何将文本文件内容保存到Javascript变量?

    我正在尝试读取超过 150 000 行文本的文本文件 我希望能够读取文本文件并将其作为 processFileContent 的参数传递 我尝试了这种方法 但它不起作用 另外 对于如此大的数据 有没有更好的方法呢 function read
  • LDAP查询群组成员

    我正在尝试进行 LDAP 查询 以获取所有组 成员的列表 我不知道我该怎么做 我所有的尝试都没有成功 我的 AD 树 mydomain local Mybusiness Distribution Groups 这是我的组 我尝试过这样的事情
  • VSCode 远程 server.sh 在 wsl docker-desktop 中找不到节点

    I have VSCode v1 46 0 远程 wsl 扩展 v0 44 3 Windows 10 操作系统版本 19041 329 Docker 桌面 v2 3 0 3 我试图在 docker desktop wsl 中打开 VSCod
  • 访问使用 ElementTree 解析的 xml 文件中的嵌套子级

    我是 xml 解析新手 这个xml文件 http ratings food gov uk OpenDataFiles FHRS408en GB xml有以下树 FHRSEstablishment gt Header gt gt Establ
  • 在递归中使用 Prolog 列表

    所以我尝试用递归的方法来寻找两个人之间的路径 这是快速背景 我定义一些事实in X Y 这表明谁是相关的 即 in person1 project1 in person2 project1 等等 现在 如果任何两个人彼此在同一个项目中 或者
  • @ExceptionHandler 不适用于 Spring MVC 3.1 单元测试

    通过在正常 servlet 上下文之外实例化对象 我可以在 Spring MVC 控制器上完成几乎所有单元测试 但我希望能够运行一些测试 以确保我的对象序列化正常工作 正在生成标头等 为了在 servlet 上下文中运行测试 我创建了一个修