如果您只对验证 JSON 映射感兴趣,您始终可以直接使用 Jackson 的 ObjectMapper 并使用 JSONassert 之类的库来验证对象结构是否匹配,以验证序列化字符串是否与您的预期结果匹配。例如:
@Autowired
private ObjectMapper objectMapper;
private Resource expectedResult = new ClassPathResource("expected.json");
@Test
public void jsonMatches() {
Foo requestBody = new Foo();
String json = objectMapper.writeValueAsString(requestBody);
String expectedJson = Files
.lines(expectedResult.getFile())
.collect(Collectors.joining());
JSONAssert.assertEquals(expectedJson, json, JSONCompareMode.LENIENT);
}
这个测试纯粹使用ObjectMapper 来验证 JSON 映射,所以您甚至可以在不需要在测试中实际引导 Spring 引导的情况下执行此操作(这可能会更快)。这样做的缺点是,如果您使用的框架与 Jackson 不同,或者 RestTemplate 更改了其实现,则此测试可能会过时。
或者,如果您有兴趣验证完整的请求是否匹配(URL、请求方法、请求正文等),您可以使用您提到的MockRestServiceServer。这可以通过将@SpringBootTest 注释添加到您的测试、自动装配RestTemplate 和调用RestTemplate 的服务来完成,例如:
@RunWith(SpringRunner.class)
@SpringBootTest
public class FooServiceTests {
@Autowired
private RestTemplate restTemplate;
@Autowired
private FooService fooService; // Your service
private MockRestServiceServer server;
@Before
public void setUp() {
server = MockRestServiceServer.bindTo(restTemplate).build();
}
}
然后您可以使用以下命令设置测试:
@Test
public void postUsesRestTemplate() throws IOException, URISyntaxException {
Path resource = Paths.get(getClass().getClassLoader().getResource("expected-foo.json").toURI());
String expectedJson = Files.lines(resource).collect(Collectors.joining());
server.expect(once(), requestTo("http://example.org/api/foo"))
.andExpect(method(HttpMethod.POST))
.andExpect(MockRestRequestMatchers.content().json(expectedJson))
.andRespond(withSuccess());
// Invoke your service here
fooService.post();
server.verify();
}