【发布时间】:2021-05-22 04:48:27
【问题描述】:
将尝试提供简化示例(希望我不会在某个地方搞砸)
假设我有 2 个相同类型的 @Bean,但其中一个带有注释
@Configuration
public class FooProvider {
@Bean
public Foo foo1() {...}
@Bean
@SpecialFoo
public Foo foo2() {...}
}
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface SpecialFoo {}
在我的应用程序中,Spring 似乎可以使用一个带注释的 bean 和一个未注释的 bean。注释是一个@Qualifier
@Configuration
public class BarProvider {
@Bean
public Bar bar1(Foo foo1) {...}
@Bean
public Bar bar2(@SpecialFoo Foo foo2) {...}
}
所有这些都有效。程序加载完毕,Spring 没有抱怨。
但是当我尝试对其进行测试时,问题就出现了。
@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = WebEnvironment.MOCK)
@AutoConfigureWebTestClient
public class MyTest {
@MockBean
Foo foo1;
@MockBean @SpecialFoo
Foo foo2;
}
此时,我收到类似的错误
没有可用的“Foo”类型的合格 bean:预期单个匹配 bean,但找到了 2:foo1, foo2
我做错了什么?
特殊要求:我不希望也不必注释foo1 或添加@Qualifier,因为我需要更改很多地方。我宁愿默认 bean 是未注释的。
【问题讨论】:
-
另外,
@MockBean("beanName")和@MockBean @Qualifier("beanName")有什么区别?我尝试了这些,但似乎没有用,尽管我可能会误用它。
标签: java spring spring-boot dependency-injection mockito