Как использовать ObjectMapper в JUnitTests - приложение Spring Boot

У меня проблема с использованием ObjectMapper в тестах JUnit в приложении Spring Boot.

Джексон картирование 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 Я вижу, что не каждое поле настроено - только описание, которое не требует какого-либо дополнительного отображения JsonProperty. Это потому @JsonProperty от Repository класс не учитывается. Вы знаете, как это исправить? В контроллере все отлично работает.

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

1 ответ

(Это перефразировано из этого ответа здесь).

Это работает, только если вы используете разные свойства и делегируете должным образом. С помощью вашего кода Джексон находит два имени для одного и того же свойства и выбирает одно: предположительно, имя методов-установщиков, так как демонтаж в контроллере работает для вас.

Вам нужны два свойства с разными именами, которые имеют одинаковое значение. Например:

@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;
}
Другие вопросы по тегам