java 如何访问 REST Assured 中的底层 Jackson ObjectMapper?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/25070085/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 07:16:09  来源:igfitidea点击:

How do I access the underlying Hymanson ObjectMapper in REST Assured?

javaHymansonrest-assured

提问by Selena

I need to configure the underlying Hymanson ObjectMapper in REST Assured. I am writing REST API tests using REST Assured and I need to define some filters to register with the ObjectMapper that is used to serialize my objects to JSON:

我需要在 REST Assured 中配置底层的 Hymanson ObjectMapper。我正在使用 REST Assured 编写 REST API 测试,我需要定义一些过滤器来注册用于将我的对象序列化为 JSON 的 ObjectMapper:

    String newTestSuite = "{\"name\":\"Added through Rest API\",\"description\":\"Test Description\",\"steps\":[]}";

    FilterProvider filters = new SimpleFilterProvider().addFilter("createNewTestSuite", new NewTestSuiteFilter());
    ObjectMapper om = new ObjectMapper();
    om.setFilters(filters);

    try {
        TestSuite ts = om.readValue(newCaspianTest, TestSuite.class);

        RequestSpecification requestSpec = new RequestSpecBuilder()
            .setBaseUri("https://somesite.com")
            .setBody(ts)
            .setUrlEncodingEnabled(false)
            .build();

        ResponseSpecification responseSpec = new ResponseSpecBuilder()
            .expectStatusCode(200)
            .expectStatusLine(Matchers.containsString("200 OK"))
            .build();

        RestAssured.given()
            .auth().basic("testUser","testPassword")
            .spec(requestSpec)
            .log().all()
            .post("/restendpoint")
                .then()
                .log().all()
                .spec(responseSpec);

    } catch(JsonParseException jpe) {

    } catch(JsonMappingException jme) {

    } catch(IOException ioe) {

    }
}

}

}

回答by sanj

You can try this:

你可以试试这个:

RestAssured.config = RestAssuredConfig.config().objectMapperConfig(new ObjectMapperConfig().Hymanson2ObjectMapperFactory(
new Hymanson2ObjectMapperFactory() {
        @Override
        public ObjectMapper create(Class aClass, String s) {
            FilterProvider filter = new SimpleFilterProvider().addFilter(...);
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.setFilters(filter);
            return objectMapper;
        }
    }
));

回答by Jason Henriksen

This will give you an object mapper that does not explode when the back end developer decides to add a new field.

这将为您提供一个对象映射器,当后端开发人员决定添加新字段时,该对象映射器不会爆炸。

RestAssured.config = RestAssuredConfig.config().objectMapperConfig(new ObjectMapperConfig().Hymanson2ObjectMapperFactory(
    new Hymanson2ObjectMapperFactory() {
      @Override
      public ObjectMapper create(Type cls, String charset) {
        ObjectMapper om = new ObjectMapper().findAndRegisterModules();
        om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        return om;
      }          

    }
));

回答by Bram

@sanj's answer was very helpful. I had to modify it slightly because I'm using RestAssuredMockMvc.

@sanj 的回答很有帮助。我不得不稍微修改它,因为我使用的是 RestAssuredMockMvc。

This is how I configure RestAssuredMockMvc to use snake_caseinstead of CamelCase:

这就是我如何配置 RestAssuredMockMvc 以使用snake_case而不是CamelCase

RestAssuredMockMvc.config = RestAssuredMockMvcConfig.config().objectMapperConfig(new ObjectMapperConfig().Hymanson2ObjectMapperFactory(
            (type, s) -> {
                ObjectMapper objectMapper = new ObjectMapper();
                objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
                return objectMapper;
            }
    ));