首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用mongodb reactive测试功能端点

无法使用mongodb reactive测试功能端点
EN

Stack Overflow用户
提问于 2017-11-09 03:15:48
回答 1查看 208关注 0票数 1

我正在使用Spring Data Reactive MongoDB存储库以非阻塞方式保存新的pojo。我的路由器功能是:

代码语言:javascript
复制
//other routes
    .andRoute(POST("/article/json"), articleHandler::createArticle);

处理函数是:

代码语言:javascript
复制
public Mono<ServerResponse> createArticle(ServerRequest request) {
        Flux<Article> article = request.bodyToFlux(Article.class);
        articleRepository.insert(article).subscribe();
        return ServerResponse.ok().build();
    }

我的测试方法:

代码语言:javascript
复制
  @Test
        public void givenNewArticle_whenDataIsValid_thenSuccess() {
            //create new article object

            webTestClient.post()
                    .uri("/article/json")
                    .body(fromObject(article))
                    .exchange()
                    .expectStatus().isOk();
        }

如果我通过curl发送json数据,则应用程序工作正常。但是测试方法不起作用。并且日志中没有错误或任何插入文档事件:

代码语言:javascript
复制
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的正确方法是什么?蒂娅!

EN

回答 1

Stack Overflow用户

发布于 2017-11-10 20:14:58

您的测试正在运行,并提示存在实际的错误。

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

错误解释

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

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

你可以用以下命令“修复”这个问题:

代码语言:javascript
复制
public Mono<ServerResponse> createArticle(ServerRequest request) {
    Flux<Article> article = request.bodyToFlux(Article.class);
    articleRepository.insert(article).subscribe().block();
    return ServerResponse.ok().build();
}

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

修复此错误

修复看起来像这样(分解的东西比所需的更多,你可以让它更短):

代码语言:javascript
复制
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());
}

与以前的解决方案相比,此修复程序具有两个优势:

  • 它是完全异步的,非阻塞的,背压信息被传递到整个管道
  • 如果在保存数据时发生错误,这将导致对客户端的错误响应(您可以使用方便的onError*反应器操作符进行自定义)

进入反应心态还远不是显而易见的,所以编写测试绝对是挑战你的假设的正确方式-你做了正确的决定。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47187870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档