gpt4 book ai didi

java - Mockito 当剩余调用参数传入为 JSON 时返回 null

转载 作者:行者123 更新时间:2023-12-02 12:05:48 25 4
gpt4 key购买 nike

我想测试一段代码,它采用 JSON 字符串并使用 JSON 字符串中的对象来调用方法

@RequestMapping(value = "/cancel", method = RequestMethod.POST, produces = "application/json")
public ReservationCancelResponseType cancel(@RequestBody CancelReservationRequest request) {
ReservationCancelResponseType result = null;

for(BrandEnum brand : request.getBrands()) {
switch(brand) {
case BRAND_NAME:
result = service.cancel(request);
break;
}
}

return result;
}

我尝试使用以下代码调用它

@Test
public void testCancel() throws Exception {
ReservationCancelResponseType responseType = new ReservationCancelResponseType();

CancelReservationRequest request = new CancelReservationRequest();
List<BrandEnum> brands = new ArrayList<>();
brands.add(BrandEnum.BRAND_NAME);
request.setBrands(brands);

String requestString = objectMapper.writeValueAsString(request);

when(service.cancel(request)).thenReturn(responseType);

this.mockMvc.perform(post("/cancel")
.contentType(MediaType.APPLICATION_JSON)
.content(requestString)
).andExpect(status().isOk());
}

我认为这不起作用的原因是因为在when().thenReturn()中调用时,我传入一个对象,但在其余调用中我传入 StringobjectMapper 创建的此对象的版本所以这些是不同的,所以我得到 null对于when().thenReturn()调用

这是正确的吗?如果是,您建议我如何解决这个问题?

最佳答案

假设您的 Controller 在测试流程中使用的服务实例与您在测试中模拟的实例肯定相同,那么问题的最可能原因是 CancelReservationRequest 的实现equals()。要么它没有 equals(),要么当 Mockito 尝试比较 when/then 所需的实例时,它的 equals() 实现返回 false使用 Controller 方法内使用的实例进行调用。

您可以通过更改...来验证这一点

when(service.cancel(request)).thenReturn(responseType)

...至:

when(service.cancel(Mockito.any(CancelReservationRequest.cla‌ss))).thenReturn(res‌​ponseType)

如果 service.cancel() 方法返回您的响应类型,那么您就会知道问题出在 CancelReservationRequest 的相等性检查上。解决此问题的方法是实现一个 equals() 方法,该方法允许 Mockito 正确地将您的 when/then 调用所需的实例与 Controller 方法内使用的实例进行比较。如果创建自定义 equals() 方法不是运行程序,您甚至可以使用 Mockito.refEq()

关于java - Mockito 当剩余调用参数传入为 JSON 时返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46914252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com