要测试JSON对象的序列化和反序列化是否按预期工作,您可以使用@JsonTest
注解。@JsonTest
将自动配置Jackson的ObjectMapper
、所有@JsonComponent
bean以及所有Jackson的Modules
。如果您恰好使用Gson
替代Jackson或是与Jackson一起使用,@JsonTest
也会配置Gson
。如果需要去配置自动配置的元素,您可以使用@AutoConfigureJsonTesters
注解。
Spring Boot包含有基于AssertJ的辅助类,它们可以与JSONassert和JsonPath库一起使用来检查JSON是否符合预期。JacksonTester
、GsonTester
和BasicJsonTester
类可以分别用于Jackson、Gson和String。使用@JsonTest
时,测试类的任何辅助字段都可以是@Autowired
的。
import org.junit.*;
import org.junit.runner.*;
import org.springframework.beans.factory.annotation.*;
import org.springframework.boot.test.autoconfigure.json.*;
import org.springframework.boot.test.context.*;
import org.springframework.boot.test.json.*;
import org.springframework.test.context.junit4.*;
import static org.assertj.core.api.Assertions.*;
@RunWith(SpringRunner.class)
@JsonTest
public class MyJsonTests {
@Autowired
private JacksonTester<VehicleDetails> json;
@Test
public void testSerialize() throws Exception {
VehicleDetails details = new VehicleDetails("Honda", "Civic");
// Assert against a `.json` file in the same package as the test
assertThat(this.json.write(details)).isEqualToJson("expected.json");
// Or use JSON path based assertions
assertThat(this.json.write(details)).hasJsonPathStringValue("@.make");
assertThat(this.json.write(details)).extractingJsonPathStringValue("@.make")
.isEqualTo("Honda");
}
@Test
public void testDeserialize() throws Exception {
String content = "{\"make\":\"Ford\",\"model\":\"Focus\"}";
assertThat(this.json.parse(content))
.isEqualTo(new VehicleDetails("Ford", "Focus"));
assertThat(this.json.parseObject(content).getMake()).isEqualTo("Ford");
}
}
JSON的辅助类也可以直接用于标准的单元测试。如果不使用
@JsonTest
,只需在@Before
方法中调用辅助类的initFields
方法即可。
被@JsonTest
激活的自动配置列表可以在附录中找到。