首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >@MockBean注入构造函数-自动配置组件

@MockBean注入构造函数-自动配置组件
EN

Stack Overflow用户
提问于 2022-10-22 09:19:13
回答 1查看 70关注 0票数 0

来自正式文件

当按类型注册时,上下文中任何匹配类型(包括子类)的现有单个bean都将被模拟替换。

但是,如果被测试的服务在构造函数中是自动的呢?例如,在Kotlin (我认为@MockkBean@MockBean在DI方面的工作方式相同):

代码语言:javascript
运行
复制
 @RunWith(SpringRunner.class)
 class ExampleTests @Autowired constructor(val userOfService: UserOfService) {

   @MockkBean
   private lateinit var service: ExampleService

   ...
}

我希望这个示例失败,因为为了实例化ExampleTests,Spring必须首先获得UserOfService的一个适当实例。但是,当时不可能这样做,因为在应用程序上下文中还没有ExampleService类型的bean。

与我的预期相反,这是可行的。这怎么可能呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-22 11:28:01

因为您错过了文档中的另一部分:

在这两种情况下,如果没有定义现有bean,那么将添加一个新bean。

因此,如果在spring上下文中找不到bean,@MockBean也会自动实例化该bean。

行动顺序主要如下:

  1. 启动spring上下文,它只创建在spring上下文中注册的所有spring BeanDefinition
  2. 进程@MockBean,它将取代(1)中的BeanDefinition或创建一个新的BeanDefinition
  3. 实际上,基于这些BeanDefinition实例化所有bean。它将处理要先实例化哪个bean,然后再实例化哪个bean。
  4. 创建一个测试实例(即ExampleTests)来执行其测试方法。如果没有创建任何需要自动连接到测试实例的bean,它将失败。

因此,只要您定义了UserOfService bean,就可以在使用@MockBean时实例化ExampleTests,这意味着无论您是否在测试的春季上下文中定义它,它都必须存在。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74162351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档