代码之家  ›  专栏  ›  技术社区  ›  user1778855

使用WebTestClient将junit5@WebFluxTest测试转换为Flux@PostMapping

  •  0
  • user1778855  · 技术社区  · 6 年前

    @WebFluxTest 为了我的 @RestController @PostMapping 部分。

    这只是一个基本的设置 @rest控制器 ,和 @Repository

    在我的 @REST控制器 :

    @RestController
    @RequestMapping("/address")
    @AllArgsConstructor
    public class AddressController {
    
        private final AddressRepository addressRepository;
    
        @ResponseStatus(HttpStatus.CREATED)
        @PostMapping(value = "/create")
        public Flux<Address> create(@RequestBody Flux<Address> address) {
            return address.flatMap(this.addressRepository::save);
        }
    }
    

    在我的测试中:

    @ExtendWith(SpringExtension.class)
    @WebFluxTest(AddressController.class)
    public class AddressControllerTest {
    
        @Autowired
        private WebTestClient webTestClient;
    
        @MockBean
        private AddressRepository addressRepository;
    
        @Test
        @DisplayName("Create")
        public void create() {
    
            Flux<Address> addresses = Flux.just("Hello").map(add -> 
                                Address.builder().id("5bf907ff2e21d401d4054a4d").street(add).build());
    
            Address add = Address.builder().id("5bf907ff2e21d401d4054a4d").street("Hello").build();
    
            when(this.addressRepository.saveAll(addresses)).thenReturn(addresses);
    
            this.webTestClient
                .post()
                .uri("/address/create")
                .body(addresses, Address.class)
                .exchange()
                .expectStatus().isCreated()
                .expectHeader().contentType(MediaType.APPLICATION_JSON_UTF8)
                .expectBody(Address.class).isEqualTo(add);
        }
    }
    

    还有一个非常简单的POJO:

    @Data
    @Builder
    @Document
    @AllArgsConstructor
    @NoArgsConstructor
    public class Address {
    
        @Id
        private String id;
        private String street;
    }
    

    我希望能够创建端点以允许 0..* 地址。

    mock 来电 create()

    when(this.addressRepository.save(add)).thenReturn(addresses);
    

    那么,这是一个 Mono

    但如果我这么做的话

    when(this.addressRepository.saveAll(addresses)).thenReturn(addresses);
    

    那就不是了 mocking 创建()

    编写这个单元测试的正确方法是什么?

    谢谢!如果我没有提供足够的信息,请告诉我。

    create Postman 给我的 /address/create 尽管如此。

    0 回复  |  直到 6 年前