@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 {
// ...
}
}