如何在JUnitTests中使用ObjectMapper - Spring Boot应用程序

时间:2017-07-26 20:39:21

标签: java spring-boot junit jackson objectmapper

我在Spring Boot应用程序的JUnit测试中使用ObjectMapper时遇到问题。

杰克逊映射POJO:

public Repository() {

    @JsonProperty(value="fullName")
    public String getFullName() {
        return fullName;
    }
    @JsonProperty(value="full_name")
    public void setFullName(String fullName) {
        this.fullName = fullName;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    @JsonProperty(value = "cloneUrl")
    public String getCloneUrl() {
        return cloneUrl;
    }
    @JsonProperty(value = "clone_url")
    public void setCloneUrl(String cloneUrl) {
        this.cloneUrl = cloneUrl;
    }
    @JsonProperty(value="stars")
    public int getStars() {
        return stars;
    }
    @JsonProperty(value="stargazers_count")
    public void setStars(int stars) {
        this.stars = stars;
    }
    ...
}

JUnit测试:

@Autowired
private ObjectMapper objectMapper;

@Test
public void testWithMockServer() throws Exception{
    Repository testRepository = new Repository();
    testRepository.setCloneUrl("testUrl");
    testRepository.setDescription("testDescription");
    testRepository.setFullName("test");
    testRepository.setStars(5);
    String repoString = objectMapper.writeValueAsString(testRepository);
  ...
}

testRepository创建String后,我发现并非每个字段都已设置 - 只有描述不需要任何添加JsonProperty映射。 这是因为@JsonProperty类的Repository未被考虑在内。你知道怎么解决吗? 在控制器中,一切都很好。

restTemplate.getForObject(repoUrlBuilder(owner,repository_name),Repository.class);

1 个答案:

答案 0 :(得分:0)

(这可以从this answer over here转述。)

仅当您使用不同的属性并进行适当委托时,此方法才有效。使用您的代码,Jackson找到同一属性的两个名称并选择一个:大概是setter方法上的名称,因为控制器中的解组正在为您工作。

您需要具有不同名称且具有相同值的两个属性。例如:

@JsonProperty(value="fullName")
public String getFullName() {
    return fullName;
}

@JsonProperty(value="full_name")
public void setFull_Name(String fullName) { // Different property name here
    this.fullName = fullName;
}