Как проверить функцию, возвращающую Mono <Void>, в которой есть еще один Mono <T>, используя StepVerifier Reactor - PullRequest
0 голосов
/ 20 июня 2020

У меня есть ServiceWebClientInterface. java вот так

import reactor.core.publisher.Mono;

public interface ServiceWebClientInterface {

    Mono<String> apiCall();
}

MyClass. java

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.HttpStatus;

public class MyClass extends AbstractGatewayFilterFactory<MyClass.Config> {

    private final ServiceWebClientInterface serviceWebClientInterface;

    MyClass(final ServiceWebClientInterface serviceWebClientInterface) {
        this.serviceWebClientInterface = serviceWebClientInterface;
    }

    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {
            return serviceWebClientInterface.apiCall().flatMap(response -> {
                if (!"Valid".equals(response)) {
                    exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
                    return exchange.getResponse().setComplete();
                }
                return chain.filter(exchange);
            });

        };
    }

    public static class Config  {
        // Put the configuration properties
    }
}

Я пытаюсь выполнить модульное тестирование myMethod с помощью StepVerifier, но я не может выполнять инструкции внутри внутренней лямбда-функции myMethod.

MyClassTest. java

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;

import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*;
class MyClassTest {

    @Mock
    ServiceWebClientInterface mockServiceWebClientInterface;
    @Mock
    private ServerWebExchange mockServerWebExchange;
    @Mock
    private GatewayFilterChain mockGatewayFilterChain;
    @Mock
    private ServerHttpResponse mockServerHttpResponse;

    @BeforeEach
    void setup() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    void test_apply_forValid() {
        when(mockServiceWebClientInterface.apiCall()).thenReturn(Mono.just("Valid"));
        MyClass.Config config = new MyClass.Config();
        MyClass myClass = new MyClass(mockServiceWebClientInterface);

        GatewayFilter gatewayFilter = myClass.apply(config);

        Mono<Void> response = gatewayFilter.filter(mockServerWebExchange, mockGatewayFilterChain);

        StepVerifier.create(response).expectComplete();

        verify(mockServiceWebClientInterface).apiCall();
        verify(mockGatewayFilterChain).filter(mockServerWebExchange);

    }

    @Test
    void test_apply_forInValid() {
        when(mockServiceWebClientInterface.apiCall()).thenReturn(Mono.just("InValid"));
        when(mockServerWebExchange.getResponse()).thenReturn(mockServerHttpResponse);
        MyClass.Config config = new MyClass.Config();
        MyClass myClass = new MyClass(mockServiceWebClientInterface);

        GatewayFilter gatewayFilter = myClass.apply(config);

        Mono<Void> response = gatewayFilter.filter(mockServerWebExchange, mockGatewayFilterChain);

        StepVerifier.create(response).expectComplete();

        verify(mockServiceWebClientInterface).apiCall();
        verify(mockServerHttpResponse).setStatusCode(eq(HttpStatus.FORBIDDEN));
        verify(mockServerHttpResponse).setComplete();
        verify(mockGatewayFilterChain, never()).filter(mockServerWebExchange);

    }


}

Пожалуйста, найдите полный код выше. Когда я запускаю тесты, я вижу, что внутренний лямбда-функция не вызывается с помощью пошагового верификатора.

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Мне удалось исправить эту проблему, используя StepVerifier.create (response) .verifyComplete ();

и имитирующий chain.filter (exchange);

0 голосов
/ 21 июня 2020

Думаю, вы хотите протестировать класс, реализующий интерфейс MyLambda. Убедитесь, что вы вводите туда serviceWebClientInterface, как указано во фрагменте кода.

Для модульного тестирования этого класса вы должны имитировать serviceWebClientInterface.apiCall() и проверить, был ли он вызван. В качестве дополнения к вашему фактическому фрагменту кода.

Для этой цели вы можете использовать библиотеку Mockito.

  • создать макет:

given(serviceWebClientInterface).willReturn(Mono.just("some text"));

  • затем проверьте, вызывается ли он:

verify(serviceWebClientInterface).apiCall()

...