Я тестирую контроллер, используя аннотацию @WebMvcTest и MockMvc, он работает нормально:
@WebMvcTest(MyController.class)
class MyControllerSpec extends Specification {
@Autowired
MockMvc mockMvc;
def "test"() {
def mockRequest = "something"
when: "we make call"
def response = mockMvc.perform(post("/getuser")
.contentType(MediaType.APPLICATION_JSON)
.content(mockRequest))
.andReturn().response
then: "we get response"
response.status == OK.value()
}
}
Я прочитал несколько статей в Интернете, в которых мы можем использовать TestRestTemplate для интеграционного тестирования.Мой вопрос заключается в том, что если я использую TestRestTemplate, должен ли я использовать его с аннотацией @SpringBootTest для теста SpringBoot?Причина, по которой я спрашиваю об этом, состоит в том, что в нашем приложении springBoot есть много контроллеров, а также код уровня сервиса / дао.Похоже, мне нужно создать TestConfigure.class для всех bean-компонентов (даже bean-компонентов для других контроллеров, которые я не тестирую) для целей тестирования, в противном случае я получу сообщение об ошибке:
Unable to start EmbeddedWebApplicationContext
due to missing EmbeddedServletContainerFactory bean
Myтестовый код с использованием TestRestTemplate:
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT,
classes = [TestConfigure.class])
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
class MyControllerSpec extends Specification {
@LocalServerPort
private int port;
@Autowired
TestRestTemplate restTemplate
private String createURLWithPort(String uri) {
return "http://localhost:" + port + uri;
}
def "Integration Success Senario"() {
given: ""
when: "we try to get a user using a rest call"
def request = new User(name, address)
String jsonResponse =
restTemplate.postForObject(createURLWithPort("/getuser"),
request, String.class)
.....
}
}