【问题标题】:Unit testing GatewayFilter causes NullPointerException单元测试 GatewayFilter 导致 NullPointerException
【发布时间】:2022-01-17 12:01:04
【问题描述】:

我正在尝试对我的 GatewayFilter 进行单元测试,但是我在运行简单的测试时遇到了麻烦。

这是目前失败的小例子

@ExtendWith(MockitoExtension.class)
public class SomeFilterTest {

    private final GatewayFilter gatewayFilter = (exchange, chain) ->
            Mono.just("Hello")
                    .flatMap(this::doSomething)
                    .switchIfEmpty(Mono.defer(() -> chain.filter(exchange)));

    private Mono<Void> doSomething(String value) {
        System.out.println(value);
        return Mono.empty();
    }

    @Test
    void test1() {
        var exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/").build());
        var chain = mock(GatewayFilterChain.class);

        gatewayFilter.filter(exchange, chain).block();
    }
}

不幸的是,它失败了,因为

供应商返回的 Mono 为 null java.lang.NullPointerException: 供应商返回的 Mono 是 在 java.base/java.util.Objects.requireNonNull 处为空(Objects.java:246) 在 reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:44) 在 reactor.core.publisher.Mono.subscribe(Mono.java:4361)

说实话,我不知道为什么会这样?

【问题讨论】:

    标签: spring unit-testing spring-webflux


    【解决方案1】:

    您尚未对模拟对象GatewayFilterChainfilter 方法调用进行存根处理。结果,供应商() -&gt; chain.filter(exchange) 返回null。您不能创建一个值为nullMono,因此例外。

    因此,您的测试应该类似于

        @Test
        public void test1() {
            var exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/").build());
            var chain = mock(WebFilterChain.class);
    
            // stubbing behaviour on our mock object
            given(chain.filter(exchange)).willReturn(Mono.empty());
    
            gatewayFilter.filter(exchange, chain).block();
        }
    

    另外,我建议在单元测试中使用StepVerifier 而不是block()。这是由reactor-test 提供的,专为单元测试响应式代码而构建

        @Test
        public void test1() {
            var exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/").build());
            var chain = mock(WebFilterChain.class);
    
            given(chain.filter(exchange)).willReturn(Mono.empty());
    
            StepVerifier.create(gatewayFilter.filter(exchange, chain))
                    .verifyComplete();
        }
    

    这是一个非常有用的Step Verifier Tutorial,可以帮助您入门

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      • 2020-04-01
      • 2021-01-07
      • 1970-01-01
      • 2019-12-04
      • 1970-01-01
      • 2016-08-03
      相关资源
      最近更新 更多