【问题标题】:I need to mock the @Bean but somehow the actual bean is being created during the junit execution我需要模拟@Bean,但是在junit执行期间以某种方式创建了实际的bean
【发布时间】:2019-08-13 12:36:49
【问题描述】:

我有一个要求,我需要模拟一个特定的 Spring bean,但是在 JUnit 执行期间,实际的 bean 也正在被实例化。

例如:

@Configuration
public class Config{

  @Bean
  public Foo fooBean(){
    return new Foo();
  }
}

这是我模拟 Foo spring bean 的代码,这样在 JUnit 执行期间,只创建模拟的 Foo bean。

@Configuration
public class MockFooBean{

  @Bean
  @Primary
  public Foo mockedBean(){
    Mockito.mock(Foo.class)
  }
}

要求是在 JUnit 执行期间,我希望调用 mockedBean()(现在正在发生这种情况),但我不希望 fooBean() 被再次调用,以创建 Foo bean。

最近编辑:

仍然没有运气。我在下面尝试过:

@Configuration
public class MockFooBean{

  @Bean
  @Primary
  public Foo mockedBean(){
    Mockito.mock(Foo.class)
  }
}

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=MockFooBean.class, loader=AnnotationConfigurationContextLoader.class)
public class TestClass{

@Autowired
private ClassUnderTest classUnderTest;

//JUNITS//

}

我非常怀念过去我们可以很好地控制代码的美好时光。有什么帮助吗?

【问题讨论】:

  • 您必须显示您用于测试的跑步者。您是否还指向您的测试配置,以便 Spring 可以将其用于测试?也看看@MockBean

标签: java spring spring-boot junit mockito


【解决方案1】:

实际上你应该有单独的测试配置。单独的 bean 用于测试,因此在运行测试时不会加载它们。

你可以通过下面的链接

https://spring.io/blog/2011/06/21/spring-3-1-m2-testing-with-configuration-classes-and-profiles

【讨论】:

    【解决方案2】:

    因为@TestConfiguration 是对当前配置的补充。它不会代替当前配置执行,但会添加和替换(如果已定义)它指定的 bean。 因此,首先加载当前配置,然后加载 TestConfiguration
    From the documentation

    如果要自定义主配置,可以使用 嵌套的@TestConfiguration 类。与嵌套的 @Configuration 类不同, 这将被用来代替你的应用程序的主要 配置,另外使用嵌套的@TestConfiguration 类 到您的应用程序的主要配置。

    为了不允许 Spring 实例化您覆盖的 bean,您必须将其从上下文中排除。为此,您可以使用:

    • 测试的具体配置
    • 个人资料
    • @ConditionalOnProperty.

    例如使用特定的测试配置:

    @ExtendWith(SpringExtension.class)
    @SpringBootTest // or a slicing test
    @Import(MyTestsConfiguration.class)
    public class FooTest {
       //...    
    }
    

    例如配置文件:

    @Profile("prod")
    @Configuration
    public class Config{
    
      @Bean
      public Foo fooBean(){
        return new Foo();
      }
    }
    
    @Profile("test")
    @Configuration
    public class MockFooBean{
    
      @Bean
      @Primary
      public Foo mockedBean(){
        Mockito.mock(Foo.class)
      }
    }
    

    在测试中,激活test 配置文件:

    @ExtendWith(SpringExtension.class)
    @SpringBootTest // or a slicing test
    @ActiveProfiles("test")
    public class FooTest{
      ....
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-17
      • 2015-06-27
      • 2023-03-17
      相关资源
      最近更新 更多