java - Spring Boot 单元测试构造函数注入
问题描述
我正在使用 Spring Boot 创建一个 REST API 并在我的控制器上编写一些单元测试。我知道在spring中注入bean的推荐方式是构造函数注入。但是当我将@SpringBootTest
注释添加到我的测试类时,我无法用构造函数注入我的控制器类,我发现自己必须使用@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。相反,您可能只想创建控制器及其依赖项。
所以你最好的选择是使用@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
因为它是默认配置。如果它没有找到它,或者你想手动指定一些配置类,也用@ContextConfiguration
.
另外,作为旁注,使用时TestRestTemplate
,您不需要指定主机和端口。restTemplate.getForObject("/cvtech/persons", String.class));
使用MockMvc
或时只需调用 Same WebTestClient
。
推荐阅读
- php - 我的弹出窗口只显示 mySQL 数据库中第一行的信息
- xml - 如何扩展主题样式属性?
- python - python3中的CSV到JSON,具有重复值
- javascript - 无法使用 Vue.js 和 Axios 上传文件
- python - Numpy追加到空数组
- javascript - 切换img src时添加transition
- html - 如何获取 HTML 页面上某个部分的文本
- heroku - 从托管在 cedar-14 堆栈上的 heroku 应用程序转发?
- angular - 如何以 Angular 形式获取下拉选项的值
- docker - docker: 'notary' 不是 docker 命令