Java 当有2个相同类型的文件时,如何@MockBean?

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

将尝试提供简化的示例(希望我不会在某个地方搞砸)

假设我有两个相同类型的@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
,或添加
@限定符。我希望默认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")