spring-boot - 带有构造函数注入的 Spring Boot @WebMvcTest 不起作用
问题描述
@WebMvcTest的构造函数注入不起作用。模拟的 bean SomeService 未初始化。为什么?Mockito不是独立于 Spring Boot 创建 SomeService 吗?
如果我使用@MockBean一切都很好,但我想使用构造函数注入。
有任何想法吗?
@WebMvcTest with constructor injection not working
package com.ust.webmini;
@RequiredArgsConstructor
@RestController
public class HelpController {
@NonNull
private final SomeService someService;
@GetMapping("help")
public String help() {
return this.someService.getTip();
}
}
-------------------------------------------
package com.ust.webmini;
@Service
public class SomeService {
public String getTip() {
return "You'd better learn Spring!";
}
}
-------------------------------------------
@WebMvcTest(HelpController.class)
public class WebMockTest {
@Autowired
private MockMvc mockMvc;
/* if we use this instead of the 2 lines below, the test will work!
@MockBean
private SomeService someService;
*/
private SomeService someService = Mockito.mock(SomeService.class);
private HelpController adviceController = new HelpController(someService);
@Test
public void test() {
// do stuff
}
}
---------------------------------------
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of constructor in com.ust.webmini.HelpController required a bean of type 'com.ust.webmini.SomeService' that could not be found.
Action:
Consider defining a bean of type 'com.ust.webmini.SomeService' in your configuration.
UnsatisfiedDependencyException: Error creating bean with name 'helpController' [...]
NoSuchBeanDefinitionException: No qualifying bean of type 'com.ust.webmini.SomeService' available: expected at least 1 bean
解决方案
@MockMvcTest
旨在提供一种简单的方法来对特定控制器进行单元测试。它不会扫描任何@Service
,@Component
或@Repository
bean,但它会拾取任何带有@SpyBean
或注释的内容@MockBean
。
@MockBean
将像创建一个指定类型的模拟一样Mockito.mock(...)
,但它还将模拟实例添加到 Spring 应用程序上下文中。然后 Spring 将尝试将 bean 注入到您的控制器中。所以 spring 基本上和你在这里做的事情是一样的:
private SomeService someService = Mockito.mock(SomeService.class);
private HelpController adviceController = new HelpController(someService);
我建议坚持使用这种@MockBean
方法。此外,如果您需要访问您的HelpController
,只需在您的测试中自动装配它。
从文档:
使用此注解将禁用完全自动配置,而仅应用与 MVC 测试相关的配置(即 @Controller、@ControllerAdvice、@JsonComponent、Converter/GenericConverter、Filter、WebMvcConfigurer 和 HandlerMethodArgumentResolver bean,但不应用 @Component、@Service 或 @Repository bean )。
如果您希望加载完整的应用程序配置并使用 MockMVC,则应考虑将 @SpringBootTest 与 @AutoConfigureMockMvc 结合使用,而不是使用此注解。
推荐阅读
- python - 在硒中如何访问警告窗口以获取未找到的信息?
- docker - 将 Docker 命令添加到我的 Docker 容器中
- javascript - Javascript将onclick事件分配给未分配正确值的多个图像
- java - Java 启动和停止线程
- python - 使用 SQL 匹配参数从两个列表中检索项目
- python - 从 PLY 中的解析器规则发出错误信号
- sql-server - 我需要显示给定产品的最高 DateTime,但是,当我使用该代码时,它会以两个不同的值显示相同的产品两次
- tensorflow - keras/tensorflow 只能处理每批固定大小的输入吗?
- javascript - 如何在传递道具时访问所有元素道具而不必在 React 中列出它们?
- c# - 在 ASP.NET Core 2.1 中,如何在用户基于角色登录后添加菜单项?