Spring集成测试 - 覆盖bean的惯用方法

时间:2017-10-23 13:44:05

标签: spring spring-boot spring-boot-test

如何在Spring(引导)集成中覆盖bean以惯用的方式测试?

到目前为止,我的源配置如下:

@Configuration
class ApplicationConfiguration {
  @Bean
  CarsRepository carsRepository() {
    // return some real sql db
  }
}

这样的测试:

@SpringBootTest
class ApplicationISpec extends Specification {
  @Configuration
  @Import(Application.class)
  static class TestConfig {
    @Bean
    @Primary
    CarsRepository testsCarsRepository() {
      // return some in-memory repository
    }
  }

  def "it can do stuff with cars"() {
    // do some REST requests to application and verify it works
    // there is no need to make real calls to real DB
  }
}

首先,测试bean testsCarsRepository方法必须与原始方法不同(这不明显,并且没有关于它的警告/错误)。 但最后一个问题是:在集成测试中用Spring覆盖bean的惯用方法是什么?

当我在Twitter上发布关于方法名称的WTF时 - Stephane Nicoll表示@Primary并非用于在测试中覆盖bean。

那么首选方式是什么?

1 个答案:

答案 0 :(得分:5)

您可以将@Profile@ActiveProfile注释一起使用来分隔测试和生产配置。例如,将测试配置更改为:

@SpringBootTest
@ActiveProfiles("test")
class CarsISpec extends Specification {
    @Configuration
    @Import(Application.class)
    @Profile("test")
    static class TestConfig {
       @Bean
       CarsRepository testsCarsRepository() {
       // return some in-memory repository
       }
  }
}

不要忘记使用ApplicationConfiguration标记生产配置@Profile("!test")

Spring Boot还提供了大量的测试工具(例如@DataJpaTest嵌入式数据库,@MockBean用于在上下文中模拟bean等。Link to doc