@JsonTest是Spring Boot提供的方便測試JSON序列化反序列化的測試工具,在Spring Boot的文檔中有一些介紹。
需要注意的是@JsonTest需要Jackson的ObjectMapper
,事實上如果你的Spring Boot項目添加了spring-web
的Maven依賴,JacksonAutoConfiguration就會自動爲你配置一個:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </dependency>
這裏沒有提供關於日期時間的例子,關於這個比較複雜,可以看我的另一篇文章:Spring Boot Jackson對於日期時間類型處理的例子。
例子1:簡單例子
源代碼見SimpleJsonTest:
@SpringBootTest(classes = SimpleJsonTest.class) @JsonTest public class SimpleJsonTest extends AbstractTestNGSpringContextTests { @Autowired private JacksonTester<Foo> json; @Test public void testSerialize() throws Exception { Foo details = new Foo("Honda", 12); // 使用通包下的json文件測試結果是否正確 assertThat(this.json.write(details)).isEqualToJson("expected.json"); // 或者使用基於JSON path的校驗 assertThat(this.json.write(details)).hasJsonPathStringValue("@.name"); assertThat(this.json.write(details)).extractingJsonPathStringValue("@.name").isEqualTo("Honda"); assertThat(this.json.write(details)).hasJsonPathNumberValue("@.age"); assertThat(this.json.write(details)).extractingJsonPathNumberValue("@.age").isEqualTo(12); } @Test public void testDeserialize() throws Exception { String content = "{\"name\":\"Ford\",\"age\":13}"; Foo actual = this.json.parseObject(content); assertThat(actual).isEqualTo(new Foo("Ford", 13)); assertThat(actual.getName()).isEqualTo("Ford"); assertThat(actual.getAge()).isEqualTo(13); } }
例子2: 測試@JsonComponent
@JsonTest可以用來測試@JsonComponent。
這個例子裏使用了自定義的@JsonComponent
FooJsonComponent:
@JsonComponent public class FooJsonComponent { public static class Serializer extends JsonSerializer<Foo> { @Override public void serialize(Foo value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException { // ... } } public static class Deserializer extends JsonDeserializer<Foo> { @Override public Foo deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException { // ... } } }
@SpringBootTest(classes = { JsonComponentJacksonTest.class, FooJsonComponent.class }) @JsonTest public class JsonComponentJacksonTest extends AbstractTestNGSpringContextTests { @Autowired private JacksonTester<Foo> json; @Test public void testSerialize() throws Exception { Foo details = new Foo("Honda", 12); assertThat(this.json.write(details).getJson()).isEqualTo("\"name=Honda,age=12\""); } @Test public void testDeserialize() throws Exception { String content = "\"name=Ford,age=13\""; Foo actual = this.json.parseObject(content); assertThat(actual).isEqualTo(new Foo("Ford", 13)); assertThat(actual.getName()).isEqualTo("Ford"); assertThat(actual.getAge()).isEqualTo(13); } }
例子3: 使用@ContextConfiguration
事實上@JsonTest也可以配合@ContextConfiguration
一起使用。
源代碼見ThinJsonTest:
@JsonTest @ContextConfiguration(classes = JsonTest.class) public class ThinJsonTest extends AbstractTestNGSpringContextTests { @Autowired private JacksonTester<Foo> json; @Test public void testSerialize() throws Exception { // ... } @Test public void testDeserialize() throws Exception { // ... } }