【问题标题】:How to @MockBean when there are 2 of the same type?当有2个相同类型时如何@MockBean?
【发布时间】: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


【解决方案1】:

这样

@Configuration
public class FooProvider {

  @Bean("foo1")
  public Foo foo1() {...}

  @Bean("foo2")
  public Foo foo2() {...}

}

...

@Autowire
@Qualifier("foo1")
Foo foo1;

@Autowire
@Qualifier("foo2")
Foo foo2;

【讨论】:

  • 这会起作用,但正如我在帖子中提到的那样,我宁愿不向foo1 添加注释或@Qualifier,因为它出现在很多地方。尽管你得到了一个可行的解决方案的赞成票。虽然应该提到@Qualifier 需要添加到@MockBean,这是原来的问题
【解决方案2】:

这是我发现的作品

@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = WebEnvironment.MOCK)
@AutoConfigureWebTestClient
public class MyTest {

  @MockBean(name = "foo1")
  Foo foo1;

  @MockBean @SpecialFoo
  Foo foo2;

}

我需要告诉 Spring 我用这个模拟替换了哪个 Foo @Bean,方法是给它要替换的 bean 的名称。如果 MockBean 有 @Qualifier@SpecialFoo 限定符注解,则不需要此命名。所以只有未注释的 bean 需要这个。

要在评论中回答我的问题,这两个似乎是等价的:

@MockBean(name = "foo1")

@MockBean @Qualifier("foo1")

希望这对其他人有所帮助

【讨论】:

    【解决方案3】:

    尝试添加类似:

    @Primary
    public Foo foo1() {
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 2016-11-26
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 2019-10-01
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      • 2023-03-26
      相关资源
      最近更新 更多