如何使用doFinally / doOnTerminate测试Spring Cloud Gateway WebFilter?

时间:2019-08-02 02:20:53

标签: spring-webflux

我在基于Spring Cloud Gateway的网关应用程序中创建了两个WebFilter。

第一个用于添加一些操作日志的

    public Mono<Void> filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) {
    ServerHttpResponse response = serverWebExchange.getResponse();
    webFilterChain.filter(serverWebExchange).doOnTerminate(() ->{
       operationLog.sendOperationLog(serverWebExchange, uri, "", response.getStatusCode().value())
    })
  }

我尝试通过如下所示的spring boot test对其进行测试。

@MockBean
OperationLog operationLog;

webTestClient.post().uri("/test")
                .exchange()
                .expectStatus().isEqualTo(HttpStatus.NOT_FOUND);

verify(operationLog, times(1))
                .sendOperationLog(any(ServerWebExchange.class), any("/test"), eq(""), eq(HttpStatus.OK.value()));

测试失败,似乎没有执行doOnTerminate回调。

但是当我在环境中调试它时,它就会执行。

1 个答案:

答案 0 :(得分:0)

您可以使用Mockito#timeout等待调用方法operationLog.sendOperationLog。像这样:

{{order.get_status_display}}

在这种情况下,mockito在100毫秒内检查调用。