22

我需要在 REST Assured 中配置底层的 Jackson 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) {

    }
}

}

4

4 回答 4

31

你可以试试这个:

RestAssured.config = RestAssuredConfig.config().objectMapperConfig(new ObjectMapperConfig().jackson2ObjectMapperFactory(
new Jackson2ObjectMapperFactory() {
        @Override
        public ObjectMapper create(Class aClass, String s) {
            FilterProvider filter = new SimpleFilterProvider().addFilter(...);
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.setFilters(filter);
            return objectMapper;
        }
    }
));
于 2014-07-31T23:22:25.747 回答
9

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

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

    }
));
于 2019-03-07T09:22:34.477 回答
2

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

这就是我将 RestAssuredMockMvc 配置为使用snake_case而不是CamelCase的方式:

RestAssuredMockMvc.config = RestAssuredMockMvcConfig.config().objectMapperConfig(new ObjectMapperConfig().jackson2ObjectMapperFactory(
            (type, s) -> {
                ObjectMapper objectMapper = new ObjectMapper();
                objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
                return objectMapper;
            }
    ));
于 2019-01-16T14:30:27.783 回答
2

考虑到使用 Rest Assured 的上下文,您通常会想要修改或提供ObjectMapper用于某些请求的上下文,但不是全部。

您可以使用以下方法实现此目的:

正如@jason-henriksen提到的那样,一个经典的用例是

  • 允许忽略未知属性
  • 忽略ReturnedType类中定义的未标记的属性,@JsonIgnore而在反序列化期间不抛出异常(当您没有控制/无法修改ReturnedType该类时很有用1

这可以通过以下方式完成:

RequestSpecification request = ...;
io.restassured.mapper.ObjectMapper objectMapper = new Jackson2Mapper(((type, charset) -> {
    com.fasterxml.jackson.databind.ObjectMapper om = new ObjectMapper().findAndRegisterModules();
    om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    return om;
}));
ReturnType response = request.get().as(ReturnType.class, objectMapper);

1 您也可以通过使用Jackson MixIns配置您的 ObjectMapper 来实现此目的。

于 2020-08-21T02:33:53.363 回答