spring 集成测试Sping Boot 3

zd287kbt  于 2023-06-21  发布在  Spring
关注(0)|答案(2)|浏览(284)

我有点困惑,试图理解为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请求,涉及所有应用程序层和服务器。

von4xj4u

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);
示例:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class MyIntegrationTest {

@Autowired private TestRestTemplate restTemplate;

@Test
publiс void myTest() {
    ResponseEntity<String> response = restTemplate.exchange("/api/something", HttpMethod.POST, requestEntity, String.class);
    // ...
}

对于WebClient(或WebTestClient),您将需要webflux。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
    <scope>test</scope>
</dependency>

这也将使它可以通过自动布线。@Autowired WebTestClient webClient;。尽管您应该考虑是否值得仅为WebTestClient添加此依赖项。

sirbozc5

sirbozc52#

你有99%的方式与你的测试。您忽略的关键是@WebMvcTest不会创建包含您的服务bean的完整spring上下文。我假设您使用的是Junit 5,因为您使用的是Spring 3。下面是一个MockMvc测试的例子,它将把实际的服务示例注入到您的控制器中。

@WebMvcTest
@ExtendWith(SpringExtension.class) // SpringExtension will spin up the full Spring context
public class PersonController_IT {
    @Autowired
    private MockMvc mockMvc;
    
    @Test
    void whenGetPersonListThenStatusOk() throws Exception {
        PersonListDto personListDto = new PersonListDto(new ArrayList<>());
        mockMvc.perform(get(BASE_URL))
                .andExpect(status().isOk())
                .andExpect(content().string("{\"persons\":[]}"));

    }
}

相关问题