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

Spring WebTestClient响应对象与预期不同

  •  0
  • crimson589  · 技术社区  · 2 年前

    我使用WebTestClient进行了控制器单元测试,但在 isEqualTo() 测试。我找不到问题所在,因为我使用同一个对象来设置服务调用将返回的内容和参数 isEqualTo()

    当我运行测试时,我会得到类似的结果

    Expected :com.model.Response@ab41b46
    Actual   :com.model.Response@c1dcdb9
    

    模型:这只是它的一部分,但其他对象只是字符串

    public class Response implements Serializable {
        private static final long serialVersionUID = 1L; //random long
        private String id;
        private Long amount;
        private LocalDateTime dateTime;
        private String status;
    
        //setters-getters
    }
    

    控制器:

    @PostMapping
    public Mono<Response> getResponse() {
         return myService.getResponse();
    }
    

    测试:

    @ExtendWith(MockitoExtension.class)
    @WebFluxTest(controllers = MyController.class)
    public class MyControllerTest
    {
        @Autowired
        private transient WebTestClient webTestClient;
    
        @MockBean
        private transient MyService myService;
    
        @Test
        void shouldReturnResponse() {
            var response = new Response();
            response.id("id");
            response.setAmount(10L);
            when(myService.getResponse()).thenReturn(Mono.just(response));
            webTestClient.post()
                    .uri("/")
                    .exchange()
                    .expectStatus().isOk()
                    .expectBody(Response.class)
                    .isEqualTo(response);
        }
    }
    

    如您所见,我删除了myService以返回Mono response 只是期望同样的事情发生 isEqualTo()

    我有一些类似的测试,它们工作得很好。我目前正在检查这是否是一个问题 Response 对象

    0 回复  |  直到 2 年前
        1
  •  1
  •   M. Deinum    2 年前

    isEqualTo 使用 equals 方法来验证对象是否相等。

    从你在这里发布的内容来看,你还没有实施 等于 方法。不 等于 方法意味着它将使用默认值,即基本上检查它是否是同一个对象实例。这显然不是真的。

    因此,要么实施适当的 等于 方法或使用不同的方式来断言你的结果。

    @Test
    void shouldReturnResponse() {
        var response = new Response();
        response.id("id");
        response.setAmount(10L);
        when(myService.getResponse()).thenReturn(Mono.just(response));
        webTestClient.post()
                .uri("/")
                .exchange()
                .expectStatus().isOk()
                .expectBody(Response.class)
                .consumeWith( (response) -> assertThat(response.getId()).isEqualTo("id"));}
    

    上面的代码片段使用AssertJ进行断言(当然,您也可以扩展这些断言)。要进行其他验证,还有其他方法 BodySpec 另外,选择一个适合你需要的。

        2
  •  0
  •   LukasI    2 年前

    您正在创建一个包含响应对象的mono对象。然后从WebTestClient获取它。You're isEqualTo比较两个对象,这两个对象并不完全相同->单声道->对象。我建议比较对象内部的值。

    Mono<Response> clientResponse = webTestClient.post()
                .uri("/")
                .exchange()
                .expectStatus().isOk()
                .expectBody(Response.class);
    
     assertThat(clientResponse.block().getId()).isEqualTo("id");
     assertThat(clientResponse.block().response.getAmount()).isEqualTo(10L);