使用自定义 ErrorAttributes 测试 Spring Boot 应用程序?

     2023-02-26     97

关键词:

【中文标题】使用自定义 ErrorAttributes 测试 Spring Boot 应用程序?【英文标题】:Testing a Spring Boot application with custom ErrorAttributes? 【发布时间】:2015-05-21 04:07:23 【问题描述】:

我正在尝试测试应使用自定义错误属性的 Spring Boot RestController。

    @Bean
public ErrorAttributes errorAttributes() 
    return new DefaultErrorAttributes() 

        @Override
        public Map<String, Object> getErrorAttributes(
                RequestAttributes requestAttributes,
                boolean includeStackTrace) 
            Map<String, Object> errorAttributes = super.getErrorAttributes(requestAttributes, includeStackTrace);
            Throwable error = getError(requestAttributes);
            return errorAttributes;
        

    ;

但是当我尝试使用简单的测试来测试自定义错误属性时,这些属性没有被考虑在内。下面的测试实际上触发了一个请求,并且 i 除了使用了自定义属性。但无论我做什么,代码似乎都没有被考虑在内。

class TestSpec extends Specification 

    MockMvc mockMvc

    def setup() 
        mockMvc = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build()
    

    def "Test simple action"() 
        when:
        def response = mockMvc.perform(post("/hello")
                .contentType(MediaType.APPLICATION_JSON)
                .content('"sayHelloTo": ""')
        )

        then:
        response.andExpect(status().isOk())
    

关于如何测试自定义属性是否有任何线索?

【问题讨论】:

【参考方案1】:

Spring Boot 的错误基础架构通过将请求转发到错误控制器来工作。正是这个错误控制器使用了ErrorAttributes 实例。 MockMvc 仅对测试请求的转发提供了相当基本的支持(您可以检查请求是否会被转发,但不能检查该转发的实际结果)。这意味着调用您的 HellowWorldController 的 MockMvc 测试,无论是使用独立设置还是基于 Web 应用程序上下文的设置,都不会驱动正确的代码路径。

几个选项:

直接对您的自定义 ErrorAttributes 类进行单元测试 编写一个基于 MockMvc 的测试,调用 Spring Boot 的 BasicErrorController,并使用您的自定义 ErrorAttributes 实例进行配置 编写一个集成测试,使用 RestTemplate 对您的服务进行实际的 HTTP 调用

【讨论】:

你有一个例子如何实现第二种方法吗?我无法理解这一点。 嗨,安迪,感谢您的回复。我什至无法正确检查请求是否已转发。调试的时候看到MockHttpServletResponseforwardedUrl是null但是不应该转发到/error吗?在MockMvc 中应用此转发是否有任何必要的配置?【参考方案2】:

test class from Spring 为您提供了一个开始自己测试的好地方!

创建自定义错误属性类的实例并使用 MockHttpServletRequest 和 WebRequest:

private final DefaultErrorAttributes errorAttributes = new YourCustomErrorAttributes();
private final MockHttpServletRequest request = new MockHttpServletRequest();
private final WebRequest webRequest = new ServletWebRequest(this.request);

对于您的测试方法:

//Set the appropriate error state in your mocked request object:
RuntimeException ex = new RuntimeException("Test");
this.request.setAttribute("javax.servlet.error.exception", ex);

//Pass the mocked request into the the methods that are normally called by the framework 
Map<String, Object> attributes = this.errorAttributes.getErrorAttributes(this.webRequest, ErrorAttributeOptions.of(Include.STACK_TRACE));   

// add your own asserts
assertThat(attributes.get("trace").toString()).startsWith("java.lang");

【讨论】:

springboot新版本(2.0.0+)自定义errorcontroller中使用errorattributes

2.0.0之前使用:@AutowiredprivateErrorAttributeserrorAttributes;privateMap<String,Object>getErrorAttributes(HttpServletRequestrequest,booleanincludeStackTrace){RequestAttributesrequestAttributes=newSe 查看详情

使用 SetTimeout 测试自定义钩子,使用 Jest 测试 useEffect

】使用SetTimeout测试自定义钩子,使用Jest测试useEffect【英文标题】:TestingcustomhookwithSetTimeoutanduseEffectwithJest【发布时间】:2021-12-2605:56:59【问题描述】:我正在尝试测试一个使用useEffect和setTimeout的相对简单的自定义挂钩。但是,... 查看详情

在 Laravel 7 测试中使用自定义测试模型

】在Laravel7测试中使用自定义测试模型【英文标题】:UsecustomtestingmodelinLaravel7tests【发布时间】:2021-06-2808:22:40【问题描述】:我正在编写一个带有基本方法的基本存储库,以便从其他存储库扩展它,例如:BaseRepository├─UserRepo... 查看详情

使用 DOH 测试自定义模块

】使用DOH测试自定义模块【英文标题】:TestingCustomModuleswithDOH【发布时间】:2013-09-2316:20:49【问题描述】:我正在尝试为我无法控制的旧JS文件/模块构建一些单元测试。JS模块使用以下模式构建...varmyModule=myMethod:function();然后我... 查看详情

使用自定义 bean 测试 PreAuthorize 注释

】使用自定义bean测试PreAuthorize注释【英文标题】:TestingPreAuthorizeannotationswithcustombeans【发布时间】:2020-10-0809:06:39【问题描述】:我正在尝试在SpringBoot中的服务方法上测试我的PreAuthorize注释。我已经设法让它评估SPeL表达式,但... 查看详情

使用自定义框架从目录运行 PHPUnit 测试

】使用自定义框架从目录运行PHPUnit测试【英文标题】:RunningPHPUnittestsfromdirectorywithcustomframework【发布时间】:2012-05-2106:20:56【问题描述】:对于我们的项目,我在PHPUnit框架之上创建了一个框架,它可以帮助我们完成编写单元测... 查看详情

如何使用反冲为自定义钩子编写测试代码

】如何使用反冲为自定义钩子编写测试代码【英文标题】:Howtowritetestcodeforcustomhookusingrecoil【发布时间】:2021-04-0701:43:03【问题描述】:我正在使用Jest为我的Web应用程序中的自定义挂钩编写测试代码。它使用Recoil进行状态管理... 查看详情

在 Android Instrumentation 测试中使用自定义属性

】在AndroidInstrumentation测试中使用自定义属性【英文标题】:UsingcustomattributeswithAndroidInstrumentationTests【发布时间】:2011-10-2720:55:53【问题描述】:我有一个包含两个子项目(应用程序和仪器测试)的android项目。在我向我的应用程... 查看详情

jmeter使用自定义编写代码

原文地址:http://blog.csdn.net/li_ok/article/details/1487685我们在做性能测试时,有时需要自己编写测试脚本,很多测试工具都支持自定义编写测试脚本,比如LoadRunner就有很多自定义脚本的协议,比如"C Vuser","Java Vuser"等协议.同样,Jmeter... 查看详情

Django 测试数据库未与自定义测试运行程序一起使用

】Django测试数据库未与自定义测试运行程序一起使用【英文标题】:Djangotestdatabasenotbeingusedwithcustomtestrunner【发布时间】:2016-05-1709:18:24【问题描述】:我正在使用Django1.9并编写了一个自定义测试运行器。我无法弄清楚为什么使... 查看详情

使用自定义值创建 CLPlacemark 以进行测试

】使用自定义值创建CLPlacemark以进行测试【英文标题】:CreatingCLPlacemarkwithcustomvaluesfortesting【发布时间】:2016-04-1321:09:22【问题描述】:我有一个应用程序可以移动CLPlacemark对象并使用它们,我想对与它们交互的几个组件进行单... 查看详情

可选择在 SBT 中使用自定义配置运行测试

】可选择在SBT中使用自定义配置运行测试【英文标题】:OptionallyrunningtestsinSBTwithacustomconfiguration【发布时间】:2021-09-3001:47:12【问题描述】:我正在尝试配置我的测试,以便默认情况下不运行其中的一部分,但可以有选择地运行... 查看详情

使用服务和插件依赖项测试自定义 Grails Taglib

】使用服务和插件依赖项测试自定义GrailsTaglib【英文标题】:TestingCustomGrailsTaglibwithServiceandPluginDependencies【发布时间】:2013-06-1109:54:06【问题描述】:我有一个需要调用服务方法的自定义标记库,该方法又使用Wsliteplugin发送和接... 查看详情

Cmake:使用自定义目标进行测试的几个项目

】Cmake:使用自定义目标进行测试的几个项目【英文标题】:Cmake:severalprojectsusingcustomtargettomaketest【发布时间】:2017-07-1218:39:26【问题描述】:假设我有一个库ProjectA,我在我的CMakefile中定义了一个自定义目标build-tests来构建我的... 查看详情

使用模拟器测试自定义位置

】使用模拟器测试自定义位置【英文标题】:Testingcustomlocationwithsimulator【发布时间】:2012-07-0901:00:25【问题描述】:我刚刚花了最后一个小时搜索-认为必须有一个答案-并没有找到太多,所以我在这里问。我正在尝试让示例应用... 查看详情

SpringWebMvcTest - 使用 @Valid 和自定义验证测试 Requestbody

】SpringWebMvcTest-使用@Valid和自定义验证测试Requestbody【英文标题】:SpringWebMvcTest-TestRequestbodyusing@Validandcustomvalidation【发布时间】:2018-03-1417:31:21【问题描述】:我正在尝试测试我的控制器端点和带有@Valid注释的请求正文。我的Tes... 查看详情

如何使用自定义插件测试 iPhone PhoneGap 应用

】如何使用自定义插件测试iPhonePhoneGap应用【英文标题】:HowtotestiPhonePhoneGapappwithcustomplug-ins【发布时间】:2013-01-1509:57:19【问题描述】:我有一个使用PhoneGap、HTML5和插件(Java代码)制作的Android应用程序。现在,我打算聘请一... 查看详情

Flask 和 Werkzeug:使用自定义标头测试发布请求

】Flask和Werkzeug:使用自定义标头测试发布请求【英文标题】:FlaskandWerkzeug:Testingapostrequestwithcustomheaders【发布时间】:2013-08-1807:13:32【问题描述】:我目前正在使用来自http://flask.pocoo.org/docs/testing/的建议测试我的应用,但我想在... 查看详情