避免使用@SpringBootTest 对测试进行存储库数据库连接
Avoid repository db connection on tests with @SpringBootTest
我有一个测试class注解了@SpringBootTest,它还有@AutoConfigureWebTestClient来测试一些路由器功能。
路由器中的所有处理程序都有指向 couchbase 的 @Autowired 存储库。
我使用 @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);
}
处理程序class
@Service
public class Handler1{
Repository1 repository;
@Autowired
public Handler1(Repository1 repository){
this.repository = repository;
}
}
测试Class
@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();
}
}
每当我 运行 测试时,它都会连接到数据库。但是测试正确使用了模拟。
日志显示:
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})
我所有的存储库都从 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 class
@Profile({"default", "development"})
public class CouchbaseConfiguration extends AbstractReactiveCouchbaseConfiguration {}
并在我的测试中启用名为 testing 的配置文件。
我有一个测试class注解了@SpringBootTest,它还有@AutoConfigureWebTestClient来测试一些路由器功能。 路由器中的所有处理程序都有指向 couchbase 的 @Autowired 存储库。 我使用 @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);
}
处理程序class
@Service
public class Handler1{
Repository1 repository;
@Autowired
public Handler1(Repository1 repository){
this.repository = repository;
}
}
测试Class
@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();
}
}
每当我 运行 测试时,它都会连接到数据库。但是测试正确使用了模拟。
日志显示:
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})
我所有的存储库都从 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 class@Profile({"default", "development"})
public class CouchbaseConfiguration extends AbstractReactiveCouchbaseConfiguration {}
并在我的测试中启用名为 testing 的配置文件。