unit-testing - Mono.doOnError() react 器 block 单元测试

标签 unit-testing mockito spring-webflux reactor

我有一个使用 spring webflux 和 reactor 的休息 Controller ,我正在为 Controller 编写单元测试。请在下面找到代码片段并帮助我编写单元测试方法来测试 .doOnError block 。

我尝试使用 Mockito 引发异常

doThrow(CriticalException.class) .when(myService).myMethod(object);

This is my unit test


StepVerifier.create(
Mono.just(
                webTestClient.post() 
                       .uri("/endpoint")
                       .accept(MediaType.APPLICATION_JSON) 


                       .body(BodyInserters.fromObject(requestJson)) //Set the body of the request to the given synchronous Object
                                            //Returns:a Mono with the response
        //Act
                       .exchange()  //Perform the exchange 
        //Assert        
                       .expectStatus().isOk() 
                       .expectBody(Agreement.class)
                       .returnResult()
                       .getResponseBody()))
                .expectNextMatches(agreementResponse -> {
                        assertNotNull(agreementResponse.getAgreementParticipant());
                        return true; 
                }) 
                .expectComplete()
                .verify();

这是我的 Controller

return Mono.fromCallable(() -> { 
            myService.myMethod(object);
            return object;
        }).log().subscribeOn(Schedulers.elastic())
                .map(p -> ResponseEntity.ok(p))
                .defaultIfEmpty(ResponseEntity.notFound().build())
                .doOnError(e -> { 
                    LOGGER.error(LOG_FORMAT, e.getMessage(), e.getStackTrace());                
                }); 


Mockito is not returning exception while myService.myMethod(object) is been called.
Please suggest proper way to write test for .defaultIfEmpty and .doOnError blocks

最佳答案

而不是在模拟 myService.myMethod(object) 时抛出 CriticalException.class 返回一个 exception 包裹在 Mono

例如:

Mockito.doReturn(Mono.error(Exception::new)).when(service).callableMethod();

在下面找到示例代码片段

import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;

class Service {

    public Mono<String> callableMethod() {

        return Mono.just("1");
    }
}

class Controller {

    private Service service;

    public Controller(Service service) {

        this.service = service;
    }

    public Mono<String> endpoint() {

        return service.callableMethod().doOnError(throwable -> {
            System.out.println("throwable = " + throwable);
        });
    }
}

public class TestClass {

    @Mock
    private Service service = Mockito.mock(Service.class);

    @Test
    public void controllerTest() {

        Mockito.doReturn(Mono.error(Exception::new)).when(service).callableMethod();

        StepVerifier.create(new Controller(service).endpoint()).verifyError();
    }
}

关于unit-testing - Mono.doOnError() react 器 block 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55522755/

相关文章:

java - 如何使用mockito模拟不同jar中的方法

java - 当响应不包含媒体类型 header 时,Spring WebClient 抛出 "Only one connection receive subscriber allowed"

spring-webflux - RSocket + webflux 请求-响应弹性

unit-testing - 客户端-服务器应用程序上的 TDD

java - 如何在单元测试执行之前实例化 session ,以便服务类中的 Autowiring session 正确创建 bean?

php - 文件导入导出模块的单元测试

java - @Produces 方法中 @Mock 的 Junit 4 范围

java - 使用 Mockito 测试 @Postconstruct

c# - 我(或我)如何对具体的依赖项进行单元测试

java - Spring WebClient - 如何根据响应头延迟重试