Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法使用mongodb测试功能终结点_Java_Spring_Spring Test_Spring Webflux - Fatal编程技术网

Java 无法使用mongodb测试功能终结点

Java 无法使用mongodb测试功能终结点,java,spring,spring-test,spring-webflux,Java,Spring,Spring Test,Spring Webflux,我正在使用Spring数据反应式MongoDB存储库来无阻塞地保存新pojo。我的路由器功能是: //other routes .andRoute(POST("/article/json"), articleHandler::createArticle); 处理函数为: public Mono<ServerResponse> createArticle(ServerRequest request) { Flux<Article> article

我正在使用Spring数据反应式MongoDB存储库来无阻塞地保存新pojo。我的路由器功能是:

//other routes
    .andRoute(POST("/article/json"), articleHandler::createArticle);
处理函数为:

public Mono<ServerResponse> createArticle(ServerRequest request) {
        Flux<Article> article = request.bodyToFlux(Article.class);
        articleRepository.insert(article).subscribe();
        return ServerResponse.ok().build();
    }
若我通过curl发送json数据,应用程序运行良好。但测试方法不起作用。并且日志中没有错误或任何插入文档事件:

2017-11-09 10:49:27.793  INFO 18224 --- [       Thread-4] org.mongodb.driver.connection            : Opened connection [connectionId{localValue:6, serverValue:17563}] to 10.45.250.101:9017
2017-11-09 10:49:27.793  INFO 18224 --- [       Thread-5] org.mongodb.driver.connection            : Opened connection [connectionId{localValue:5, serverValue:17562}] to 10.45.250.101:9017
2017-11-09 10:49:28.115  INFO 18224 --- [      Thread-11] .r.c.ReactiveWebServerApplicationContext : Closing org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext@4e423aa2: startup date [Thu Nov 09 10:49:23 MSK 2017]; root of context hierarchy
2017-11-09 10:49:28.117 DEBUG 18224 --- [      Thread-11] o.s.d.r.l.RedisMessageListenerContainer  : Stopped RedisMessageListenerContainer
2017-11-09 10:49:28.127  INFO 18224 --- [      Thread-11] org.mongodb.driver.connection            : Closed connection [connectionId{localValue:4, serverValue:17561}] to 10.45.250.101:9017 because the pool has been closed.
2017-11-09 10:49:28.128  INFO 18224 --- [      Thread-11] org.mongodb.driver.connection            : Closed connection [connectionId{localValue:3, serverValue:17560}] to 10.45.250.101:9017 because the pool has been closed.
2017-11-09 10:49:28.129  INFO 18224 --- [      Thread-11] org.mongodb.driver.connection            : Closed connection [connectionId{localValue:5, serverValue:17562}] to 10.45.250.101:9017 because the pool has been closed.
2017-11-09 10:49:28.129  INFO 18224 --- [      Thread-11] org.mongodb.driver.connection            : Closed connection [connectionId{localValue:6, serverValue:17563}] to 10.45.250.101:9017 because the pool has been closed.
2017-11-09 10:49:28.132  INFO 18224 --- [      Thread-11] r.ipc.netty.tcp.BlockingNettyContext     : Stopped HttpServer on /0:0:0:0:0:0:0:0:61441
通过WebTestClient测试restful api的正确方法是什么?
蒂亚

您的测试正在运行,并且暗示了一个实际的bug

一般规则:在返回反应类型的方法中,绝不能调用
subscribe
相反,应该从头到尾构建一个反应管道

错误解释 在这种情况下,调用
subscribe
将触发保存操作,但不能保证方法在完成后返回
subscribe
返回跟踪该操作完成(成功或错误)的
Disposable
。保存该数据的实际工作可能发生在不同的线程中

当使用curl手动完成时,这是有效的,因为在服务器返回响应后,应用程序仍在运行。对于您的测试,应用程序在执行保存操作之前停止。保存操作尚未执行

您可以通过以下方式“修复”此问题:

public Mono<ServerResponse> createArticle(ServerRequest request) {
    Flux<Article> article = request.bodyToFlux(Article.class);
    articleRepository.insert(article).subscribe().block();
    return ServerResponse.ok().build();
}
公共Mono createArticle(服务器请求){ Flux article=request.bodyToFlux(article.class); articleRepository.insert(article.subscribe().block(); 返回ServerResponse.ok().build(); }

但是,通过这种修复,你可以在你的反应管道中间引入一个阻塞操作——这是一个严重的性能问题。这样做可能会阻塞服务器的几个线程,并导致性能非常差

修正这个错误 修复程序如下所示(分解的内容比所需的要多,您可以将其缩短得多):

公共Mono createArticle(服务器请求){ 通量项目=request.bodyToFlux(Article.class); Flux savedArticles=articleRepository.insert(文章); 返回savedArticles.then(ServerResponse.ok().build()); } 与以前的解决方案相比,此修复方案有两个优点:

  • 它是完全异步、无阻塞的,背压信息被传送到整个管道
  • 如果在保存数据时发生错误,这将导致对客户端的错误响应(您可以使用handy
    onError*
    Reactor操作符自定义内容)
进入被动思维模式远非显而易见,因此编写测试肯定是挑战你的假设的正确方式——你做了正确的决定

public Mono<ServerResponse> createArticle(ServerRequest request) {
    Flux<Article> article = request.bodyToFlux(Article.class);
    articleRepository.insert(article).subscribe().block();
    return ServerResponse.ok().build();
}
public Mono<ServerResponse> createArticle(ServerRequest request) {
    Flux<Article> articles = request.bodyToFlux(Article.class);
    Flux<Article> savedArticles = articleRepository.insert(articles);
    return savedArticles.then(ServerResponse.ok().build());
}