Spring 引导单元测试构造函数注入
Spring Boot unit test constructor injection
我正在使用 Spring Boot 创建 REST API 并在我的控制器上编写一些单元测试。
我知道在 spring 中注入 bean 的推荐方式是构造函数注入。
但是当我将 @SpringBootTest
注释添加到我的测试 class 时,我无法使用构造函数注入我的控制器 class,我发现自己不得不使用 @Autowired
.
有一些解释,还有另一种使用构造函数注入的方法 SpringBootTest
。
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class PersonControllerTest {
@LocalServerPort
private int port;
@Autowired
private PersonController controller;
@Autowired
private TestRestTemplate restTemplate;
@Test
public void greetingShouldReturnDefaultMessage() throws Exception {
assertThat(this.restTemplate.getForObject("http://localhost:" + port + "/cvtech/Persons/",
String.class)).contains("content");
}
@Test
public void contextLoads() throws Exception {
assertThat(controller).isNotNull();
}
@Test
void findAllByJob() {
}
}
您的测试可以使用字段注入,因为测试本身不属于您的域;测试不会成为您的应用程序上下文的一部分。
还有
您不想使用 SpringBootTest
来测试控制器,因为那样会连接所有可能太重的 bean time-consuming。相反,您可能只想创建您的控制器及其依赖项。
所以您最好的选择是使用 @WebMvcTest
,它只会创建测试指定控制器所需的 bean。
@ExtendWith(SpringExtension.class)
@WebMvcTest(controllers = PersonController.class)
class PersonControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void greetingShouldReturnDefaultMessage() throws Exception {
mockMvc.perform(get("/cvtech/Persons"))
.andExpect(status().isOk())
.andExpect(content().string(contains("content")));
}
}
请注意,@WebMvcTest
将搜索带有 @SpringBootConfiguration
注释的 class 作为默认配置。如果没有找到,或者你想手动指定一些配置classes,也用@ContextConfiguration
注释测试。
此外,作为旁注,当使用 TestRestTemplate
时,您不需要指定主机和端口。只需致电 restTemplate.getForObject("/cvtech/persons", String.class));
使用 MockMvc
或 WebTestClient
.
时相同
我正在使用 Spring Boot 创建 REST API 并在我的控制器上编写一些单元测试。
我知道在 spring 中注入 bean 的推荐方式是构造函数注入。
但是当我将 @SpringBootTest
注释添加到我的测试 class 时,我无法使用构造函数注入我的控制器 class,我发现自己不得不使用 @Autowired
.
有一些解释,还有另一种使用构造函数注入的方法 SpringBootTest
。
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class PersonControllerTest {
@LocalServerPort
private int port;
@Autowired
private PersonController controller;
@Autowired
private TestRestTemplate restTemplate;
@Test
public void greetingShouldReturnDefaultMessage() throws Exception {
assertThat(this.restTemplate.getForObject("http://localhost:" + port + "/cvtech/Persons/",
String.class)).contains("content");
}
@Test
public void contextLoads() throws Exception {
assertThat(controller).isNotNull();
}
@Test
void findAllByJob() {
}
}
您的测试可以使用字段注入,因为测试本身不属于您的域;测试不会成为您的应用程序上下文的一部分。
还有
您不想使用 SpringBootTest
来测试控制器,因为那样会连接所有可能太重的 bean time-consuming。相反,您可能只想创建您的控制器及其依赖项。
所以您最好的选择是使用 @WebMvcTest
,它只会创建测试指定控制器所需的 bean。
@ExtendWith(SpringExtension.class)
@WebMvcTest(controllers = PersonController.class)
class PersonControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void greetingShouldReturnDefaultMessage() throws Exception {
mockMvc.perform(get("/cvtech/Persons"))
.andExpect(status().isOk())
.andExpect(content().string(contains("content")));
}
}
请注意,@WebMvcTest
将搜索带有 @SpringBootConfiguration
注释的 class 作为默认配置。如果没有找到,或者你想手动指定一些配置classes,也用@ContextConfiguration
注释测试。
此外,作为旁注,当使用 TestRestTemplate
时,您不需要指定主机和端口。只需致电 restTemplate.getForObject("/cvtech/persons", String.class));
使用 MockMvc
或 WebTestClient
.