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

Posted

技术标签:

【中文标题】如何在 JUnitTests 中使用 ObjectMapper - Spring Boot 应用程序【英文标题】:How to use ObjectMapper in JUnitTests - Spring Boot app 【发布时间】:2018-01-02 08:50:16 【问题描述】:

我在 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 创建字符串后,我看到并非每个字段都已设置 - 只有描述不需要任何附加的 JsonProperty 映射。 那是因为Repository 类中的@JsonProperty 没有被考虑在内。你知道如何解决吗? 在控制器中,一切正常。

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

【问题讨论】:

【参考方案1】:

(转述自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;

【讨论】:

以上是关于如何在 JUnitTests 中使用 ObjectMapper - Spring Boot 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Typescript 中输入 Object.entries() 和 Object.fromEntries?

如何使用提供程序将 List<object> 存储在 sharedpreferences 中?

如何在 Django 中使用 .object 查询数据库

如何在 Activity 中使用 Room 和 LiveData 删除 LiveData<Object>?

在powershell中使用Tee-Object时如何保留颜色?

如何使用 Select-object 在单个查询中获取进程和线程的详细信息?