Если вы заинтересованы только в проверке сопоставления JSON, вы всегда можете напрямую использовать 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 в вашем тесте (что может быть быстрее),Недостатком этого является то, что если вы используете другую среду, чем Джексон, или если 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();
}