Chapter 2: Annotations - @JsonTest
@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 {
// ...
}
}