我有点困惑,试图理解为Sping Boot 3 rest API应用程序(data jpa,spring mvc)运行集成测试的最佳方式。对于单元测试,我用途:
@WebMvcTest
@AutoConfigureMockMvc(addFilters = false)
class PersonControllerTest {
@MockBean
private PersonService personService;
@MockBean
private SkillService skillService;
@Autowired
private MockMvc mockMvc;
@Test
void whenGetPersonListThenStatusOk() throws Exception {
PersonListDto personListDto = new PersonListDto(new ArrayList<>());
when(personService.getAllPersons()).thenReturn(personListDto);
mockMvc.perform(get(BASE_URL))
.andExpect(status().isOk())
.andExpect(content().string("{\"persons\":[]}"));
}
但是对于集成测试,我不知道该用什么。我可以使用mockMvc(它只用于unittest)吗?或者Webclient(据我所知,它只适用于React式应用程序,需要Jetty)?
因此,目标是运行一个真实的的HTTP请求,涉及所有应用程序层和服务器。
2条答案
按热度按时间von4xj4u1#
因此,目标是运行一个真实的的HTTP请求,涉及所有应用程序层和服务器。
对于真实的的http请求,可以使用
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
。这将在随机空闲端口上启动您的应用程序,并自动配置TestRestTemplate。@Autowired private TestRestTemplate restTemplate;
不需要在测试代码中指定端口(或主机),因为它是预配置的。
ResponseEntity<String> response = restTemplate.exchange("/api/something", HttpMethod.POST, requestEntity, String.class);
示例:
对于WebClient(或WebTestClient),您将需要webflux。
这也将使它可以通过自动布线。
@Autowired WebTestClient webClient;
。尽管您应该考虑是否值得仅为WebTestClient添加此依赖项。sirbozc52#
你有99%的方式与你的测试。您忽略的关键是@WebMvcTest不会创建包含您的服务bean的完整spring上下文。我假设您使用的是Junit 5,因为您使用的是Spring 3。下面是一个MockMvc测试的例子,它将把实际的服务示例注入到您的控制器中。