【问题标题】:Avoid repository db connection on tests with @SpringBootTest避免使用 @SpringBootTest 进行测试的存储库数据库连接
【发布时间】:2020-10-10 05:27:09
【问题描述】:

我有一个用@SpringBootTest 注解的测试类,它也有@AutoConfigureWebTestClient 来测试一些路由器功能。 路由器中的所有处理程序都有 @Autowired 存储库,这些存储库会转到 couchbase。 我使用@MockBean 来测试其中一个存储库,但不是我没有使用其他存储库。

路由器

@Configuration
public class Router {

 public Router(Handler1 handler1, Handler2 handler2){
  this.handler1 = handler1;
  this.handler2 = handler2;
}

@Bean
public RouterFunction<ServerResponse> route() {
 return RouterFunctions()
                .route(GET("/path1").and(accept(MediaType.APPLICATION_JSON)), handler1::findAll)
                .andRoute(GET("/path2").and(accept(MediaType.APPLICATION_JSON)), handler2::findAll);
}

处理类

@Service
public class Handler1{
 Repository1 repository;

 @Autowired
 public Handler1(Repository1 repository){
  this.repository = repository;
 }
}

测试类

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@AutoConfigureWebTestClient
public class Handler1Test {
  @Autowired
  private WebTestClient webClient;
  
  @MockBean
  private Repository1 repositoryMock;

  @Test
  public void findAll() throws IOException {
   Mockito.when(repositoryMock.findall()).thenReturn(Mono.just(""));
   webClient.get()
                .uri("/path1")
                .accept(MediaType.APPLICATION_JSON)
                .exchange()
                .expectStatus().isOk();
  }
}

每当我运行测试时,它都会连接到数据库。但是测试正确地使用了 mock。

日志显示:

2020-06-19 15:36:45.295  INFO 41724 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Couchbase repositories in DEFAULT mode.
2020-06-19 15:36:45.525  INFO 41724 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 229ms. Found 21 Couchbase repository interfaces.

如何阻止连接发生?

编辑: 如果我加了这个注解还想连接

@EnableAutoConfiguration(exclude = {CouchbaseAutoConfiguration.class,
 CouchbaseDataAutoConfiguration.class,
 CouchbaseRepositoriesAutoConfiguration.class,
 CouchbaseReactiveDataAutoConfiguration.class,
 CouchbaseReactiveRepositoriesAutoConfiguration.class})

【问题讨论】:

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


    【解决方案1】:

    我所有的存储库都是从 ReactiveCouchbaseRepository 扩展而来的,所以在我的例子中,除了 CouchbaseReactiveRepositoriesAutoConfiguration.class 之外,它完成了这项工作:

    @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
    @EnableAutoConfiguration(exclude = {CouchbaseAutoConfiguration.class,
        CouchbaseDataAutoConfiguration.class,
        CouchbaseRepositoriesAutoConfiguration.class,
        CouchbaseReactiveDataAutoConfiguration.class,
        CouchbaseReactiveRepositoriesAutoConfiguration.class})
    @AutoConfigureWebTestClient
    public class GeographicAreaHandlerTest {...}
    

    但这还不够。我必须用

    注释我的 CouchbaseConfiguration 类
    @Profile({"default", "development"})
    public class CouchbaseConfiguration extends AbstractReactiveCouchbaseConfiguration {}
    

    并在我的测试中启用名为 testing 的配置文件。

    【讨论】:

      猜你喜欢
      • 2014-06-04
      • 2020-02-19
      • 2017-07-11
      • 2015-12-15
      • 2021-11-27
      • 1970-01-01
      • 2012-11-13
      • 1970-01-01
      • 2019-04-18
      相关资源
      最近更新 更多