RestAssured - 未识别的字段,未标记为可忽略。

5
(注意:我看到了多个关于“Jackson抱怨无法识别属性”的问题的答案,但没有找到一个特别使用RestAssured的对象映射器解决的)。
我有一个RestAssured测试,并且它有效
@Test
public void objectMappingRelyingOnClassAnnotation() {

    User user = RestAssured.get("https://api.github.com/users/andrejss88")
            .as(User.class); // must have 'jackson-databind' dependency

    Assert.assertEquals(user.login, "andrejss88");
}

它之所以有效,是因为该类被注释,如在这里解释的那样:

@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
    public String login;
    public int id;
}

然而,我想使用重载的 as() 方法,并传递自己的映射器而不使用注释的替代方法:

<T> T as(Class<T> cls, ObjectMapper mapper);

但是Jackson的映射器不起作用:

@Test
public void objectMappingUsingSpecifiedMapper() {

    //  Doesn't compile - Jackson's ObjectMapper != RestAssured's Mapper
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    AnotherUser user = RestAssured.get("https://api.github.com/users/andrejss88")
            .as(AnotherUser.class, objectMapper);

    Assert.assertEquals(user.login, "andrejss88");
}

我该如何定义和传递自己的映射器?
1个回答

6

需要实现RestAssured的Mapper接口,底层仍然可以像下面这样使用Jackson的mapper:

@Test
public void objectMappingUsingSpecifiedMapper() {

    AnotherUser user = RestAssured.get("https://api.github.com/users/andrejss88")
            .as(AnotherUser.class, getMapper());

    Assert.assertEquals(user.login, "andrejss88");
    Assert.assertEquals(user.id, 11834443);
}

// pre-Java8 way
private Jackson2Mapper getMapper() {
    return new Jackson2Mapper(new Jackson2ObjectMapperFactory() {
        @Override
        public ObjectMapper create(Type type, String s) {
            ObjectMapper om = new ObjectMapper().findAndRegisterModules();
            om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            return om;
        }
    });
}

// Java8+ way 
private Jackson2Mapper getMapperLambda() {
    return new Jackson2Mapper((type, s) -> {
        ObjectMapper om = new ObjectMapper().findAndRegisterModules();
        om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        return om;
    });
}

此外,您可以像这样在RestAssured的全局配置中定义此映射器:

(感谢Jason:https://groups.google.com/g/rest-assured/c/xi78ZMqlovU?pli=1

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;
          }          
          
        }
    ));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接