来自正式文件
当按类型注册时,上下文中任何匹配类型(包括子类)的现有单个bean都将被模拟替换。
但是,如果被测试的服务在构造函数中是自动的呢?例如,在Kotlin (我认为@MockkBean和@MockBean在DI方面的工作方式相同):
@RunWith(SpringRunner.class)
class ExampleTests @Autowired constructor(val userOfService: UserOfService) {
@MockkBean
private lateinit var service: ExampleService
...
}我希望这个示例失败,因为为了实例化ExampleTests,Spring必须首先获得UserOfService的一个适当实例。但是,当时不可能这样做,因为在应用程序上下文中还没有ExampleService类型的bean。
与我的预期相反,这是可行的。这怎么可能呢?
发布于 2022-10-22 11:28:01
因为您错过了文档中的另一部分:
在这两种情况下,如果没有定义现有bean,那么将添加一个新bean。
因此,如果在spring上下文中找不到bean,@MockBean也会自动实例化该bean。
行动顺序主要如下:
BeanDefinition。@MockBean,它将取代(1)中的BeanDefinition或创建一个新的BeanDefinitionBeanDefinition实例化所有bean。它将处理要先实例化哪个bean,然后再实例化哪个bean。因此,只要您定义了UserOfService bean,就可以在使用@MockBean时实例化ExampleTests,这意味着无论您是否在测试的春季上下文中定义它,它都必须存在。
https://stackoverflow.com/questions/74162351
复制相似问题