40.3.6 自动配置的JSON测试

你可以使用@JsonTest测试对象JSON序列化和反序列化是否工作正常,该注解将自动配置Jackson ObjectMapper@JsonComponent和Jackson Modules。如果碰巧使用gson代替Jackson,该注解将配置Gson。使用@AutoConfigureJsonTesters可以配置auto-configuration的元素。

Spring Boot提供基于AssertJ的帮助类(helpers),可用来配合JSONassert和JsonPath libraries检测JSON是否为期望的,JacksonHelperGsonHelperBasicJsonTester分别用于Jackson,Gson,Strings。当使用@JsonTest时,你可以在测试类中@Autowired任何helper字段:

  1. import org.junit.*;
  2. import org.junit.runner.*;
  3. import org.springframework.beans.factory.annotation.*;
  4. import org.springframework.boot.test.autoconfigure.json.*;
  5. import org.springframework.boot.test.context.*;
  6. import org.springframework.boot.test.json.*;
  7. import org.springframework.test.context.junit4.*;
  8. import static org.assertj.core.api.Assertions.*;
  9. @RunWith(SpringRunner.class)
  10. @JsonTest
  11. public class MyJsonTests {
  12. @Autowired
  13. private JacksonTester<VehicleDetails> json;
  14. @Test
  15. public void testSerialize() throws Exception {
  16. VehicleDetails details = new VehicleDetails("Honda", "Civic");
  17. // Assert against a `.json` file in the same package as the test
  18. assertThat(this.json.write(details)).isEqualToJson("expected.json");
  19. // Or use JSON path based assertions
  20. assertThat(this.json.write(details)).hasJsonPathStringValue("@.make");
  21. assertThat(this.json.write(details)).extractingJsonPathStringValue("@.make")
  22. .isEqualTo("Honda");
  23. }
  24. @Test
  25. public void testDeserialize() throws Exception {
  26. String content = "{\"make\":\"Ford\",\"model\":\"Focus\"}";
  27. assertThat(this.json.parse(content))
  28. .isEqualTo(new VehicleDetails("Ford", "Focus"));
  29. assertThat(this.json.parseObject(content).getMake()).isEqualTo("Ford");
  30. }
  31. }

JSON帮助类可用于标准单元测试类,如果没有使用@JsonTest,你需要在@Before方法中调用帮助类的initFields方法。

附录中可以查看@JsonTest开启的自动配置列表。