我有一个使用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
对象的问题
2条答案
按热度按时间v1l68za41#
isEqualTo
使用equals
方法来验证对象是否相等。从你在这里发布的内容来看,你还没有实现
equals
方法。没有equals
方法意味着它将使用默认值,即基本上检查它是否是同一个对象示例。显然这不是真的。因此,要么实现一个适当的
equals
方法,要么使用不同的方法Assert结果。上面的代码片段使用AssertJ进行Assert(当然,您也可以扩展这些)。要执行其他验证,
BodySpec
上还有其他方法,请选择适合您需要的方法。vkc1a9a22#
您正在创建一个mono对象,其中包含响应对象。然后从WebTestClient获取它。isEqualTo比较了两个Object,它们不是完全相同的object -> mono -> object。我建议比较对象内部的值。