- Chapter 2: Annotations - @JsonTest
- 例子1:简单例子
- 例子2: 测试@JsonComponent
- 例子3: 使用@ContextConfiguration
- 参考文档
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)@JsonTestpublic class SimpleJsonTest extends AbstractTestNGSpringContextTests {@Autowiredprivate JacksonTester<Foo> json;@Testpublic 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);}@Testpublic 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:
@JsonComponentpublic class FooJsonComponent {public static class Serializer extends JsonSerializer<Foo> {@Overridepublic void serialize(Foo value, JsonGenerator gen, SerializerProvider serializers)throws IOException, JsonProcessingException {// ...}}public static class Deserializer extends JsonDeserializer<Foo> {@Overridepublic Foo deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {// ...}}}
测试代码JsonComponentJsonTest:
@SpringBootTest(classes = { JsonComponentJacksonTest.class, FooJsonComponent.class })@JsonTestpublic class JsonComponentJacksonTest extends AbstractTestNGSpringContextTests {@Autowiredprivate JacksonTester<Foo> json;@Testpublic void testSerialize() throws Exception {Foo details = new Foo("Honda", 12);assertThat(this.json.write(details).getJson()).isEqualTo("\"name=Honda,age=12\"");}@Testpublic 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 {@Autowiredprivate JacksonTester<Foo> json;@Testpublic void testSerialize() throws Exception {// ...}@Testpublic void testDeserialize() throws Exception {// ...}}
参考文档
- Spring Framework Testing
- Spring Boot Testing
- @JsonTest
- JsonComponent
- JacksonAutoConfiguration
- JacksonTester
- GsonTester
- BasicJsonTester
