【问题标题】:How to do integration tests on Spring Controller Advice如何在 Spring Controller Advice 上进行集成测试
【发布时间】:2016-11-09 15:07:35
【问题描述】:

标题 100% 解释了我的问题。假设 Spring Boot/MVC 中有 @ControllerAdvice 注释类。在我的例子中,它包含 @ExceptionHandler 注释。好的,我可以对这个类进行单元测试(它返回带有异常类信息的格式化 JSON)。这很容易——尤其是在使用 Spock 时。

但是集成测试呢?测试我对 Spring 库的使用是否正确的唯一方法是创建仅用于测试目的的控制器,向其中添加一些方法,例如。抛出特定类型的异常,看看它是否返回我设计的 @ControllerAdvice 来返回。但它看起来很丑 - 创建额外的代码只是为了测试现有的代码。

所以我的问题是 - 您如何在 @ControllerAdvice 上进行集成测试?你只是不这样做,创建特殊的控制器只是为了测试@ControllerAdvice,或者只是使用现有的控制器来测试它,例如提供错误的数据,这将导致异常被抛出(在我的情况下,如果它是@InitBinder 方法我们会检查ModelAndView)?

【问题讨论】:

    标签: spring-mvc spring-boot integration-testing spock spring-test-mvc


    【解决方案1】:

    对于 Spring Framework 中的集成测试,测试应执行以下操作:

    • 实例化应用程序上下文。在您的情况下,应用程序上下文必须包含控制器和控制器建议
    • 在控制器定义的 HTTP 端点上发出请求
    • 断言结果

    您可以在此处找到更多关于 Spring 集成测试的详细信息:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html#spring-mvc-test-framework

    【讨论】:

    • 我知道,但在您的解决方案中涉及控制器。我的问题是 - 我应该创建单独的控制器来测试 @ControllerAdvice 类还是使用现有的?
    • 我不会为了测试建议而创建一个新的控制器,为什么不使用现有的呢?通过这种方式,您可以使用旨在在应用程序中工作的实际流程来测试建议。
    • 假设我想测试 ValidationException 的处理程序。我的应用程序中唯一会生成此异常的地方是当我尝试访问外部系统、获取一些数据、然后创建一个对象并对其进行验证时。它主要在@Service bean 中完成。那么您如何建议在集成测试期间使用现有控制器模拟这种情况?
    • 在集成测试的应用程序上下文中,我将放置一个模拟服务的 bean。该模拟将引发任何方法调用的异常(使用 Mockito),如果设置正确,建议将捕获它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 2018-02-01
    • 2015-08-12
    • 2017-06-11
    • 1970-01-01
    相关资源
    最近更新 更多