Java 当有2个相同类型的文件时,如何@MockBean?
将尝试提供简化的示例(希望我不会在某个地方搞砸) 假设我有两个相同类型的@Bean,但其中一个是注释的Java 当有2个相同类型的文件时,如何@MockBean?,java,spring,spring-boot,dependency-injection,mockito,Java,Spring,Spring Boot,Dependency Injection,Mockito,将尝试提供简化的示例(希望我不会在某个地方搞砸) 假设我有两个相同类型的@Bean,但其中一个是注释的 @Configuration public class FooProvider { @Bean public Foo foo1() {...} @Bean @SpecialFoo public Foo foo2() {...} } @Qualifier @Retention(RetentionPolicy.RUNTIME) public @interface Spe
@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
,或添加@限定符。我希望默认bean是未注释的bean。尝试添加如下内容:
@Primary
public Foo foo1() {
...
}
像这样
@Configuration
public class FooProvider {
@Bean("foo1")
public Foo foo1() {...}
@Bean("foo2")
public Foo foo2() {...}
}
...
@Autowire
@Qualifier("foo1")
Foo foo1;
@Autowire
@Qualifier("foo2")
Foo foo2;
这就是我发现有效的方法
@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = WebEnvironment.MOCK)
@AutoConfigureWebTestClient
public class MyTest {
@MockBean(name = "foo1")
Foo foo1;
@MockBean @SpecialFoo
Foo foo2;
}
我需要告诉Spring我用这个mock替换了哪个Foo@Bean,并给它取名。如果MockBean有一个@Qualifier
或@SpecialFoo
限定符注释,那么它不需要这个命名。因此,只有未注释的bean需要这样做
为了回答我在评论中的问题,这两个似乎是等价的:
@MockBean(name = "foo1")
及
希望这对其他人有所帮助同样,与@MockBean(“beanName”)
相比@MockBean@Qualifier(“beanName”)
有什么区别?我尝试了这些,但似乎没有起作用,尽管我可能误用了它。这会起作用,但正如我在文章中提到的,我不想在foo1
中添加注释或@Qualifier,因为它出现在很多地方。不过,对于一个有效的解决方案,你可以投赞成票。尽管应该提到,@Qualifier需要添加到@MockBean中,这是最初的问题
@MockBean @Qualifier("foo1")