[英]Spring: unit test for class that has both field & constructor injection
[英]Spring Boot unit test constructor injection
我正在使用 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
或WebTestClient
时相同。
对于那些使用 Kotlin 的人来说,使用字段注入意味着必须使用lateinit var
字段。 这远非理想。
但是,可以在 SpringBoot 测试中使用构造函数注入,使用@TestConstructor :
@ExtendWith(SpringExtension::class)
@TestConstructor(autowireMode = ALL)
@SpringBootTest(
classes = [MyApplication::class],
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
)
internal class MyIntegrationTest(
val beanA: BeanA,
@Qualifier("some qualified") val beanB: BeanB,
) {
...
// Tests can use the beans injected in the constructor without any problems
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.