Spring WebTestClient响应对象与预期的不同

rryofs0p  于 2023-06-21  发布在  Spring
关注(0)|答案(2)|浏览(111)

我有一个使用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进行了存根处理,以返回response的Mono,并期望在isEqualTo()上也返回相同的结果
我有一些类似的测试,他们的工作很好。我正在检查这是否是Response对象的问题

v1l68za4

v1l68za41#

isEqualTo使用equals方法来验证对象是否相等。
从你在这里发布的内容来看,你还没有实现equals方法。没有equals方法意味着它将使用默认值,即基本上检查它是否是同一个对象示例。显然这不是真的。
因此,要么实现一个适当的equals方法,要么使用不同的方法Assert结果。

@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进行Assert(当然,您也可以扩展这些)。要执行其他验证,BodySpec上还有其他方法,请选择适合您需要的方法。

vkc1a9a2

vkc1a9a22#

您正在创建一个mono对象,其中包含响应对象。然后从WebTestClient获取它。isEqualTo比较了两个Object,它们不是完全相同的object -> mono -> object。我建议比较对象内部的值。

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);

相关问题