使用 Mockito 断言带有两个尾随零的 BigDecimal
Assert BigDecimal with two trailing zeros using Mockito
我有一个 api,returns 产品的价格有两位小数,即使这些小数为零,即 100.00,也应该发生这种情况。但是,mockito 测试失败并删除了其中一个零,我不确定为什么。我试图强制刻度有两个零,但这也不起作用,即使 api 本身按预期工作。
@Test
public void testGetAllProductsOneItemOnlySo() throws Exception {
UUID productId = UUID.fromString("ac358df7-4a38-4ad0-b070-59adcd57dde0");
ProductQueryDto productQueryDto = new ProductQueryDto(productId, "product", "prod description", new BigDecimal("100.00").setScale(2, RoundingMode.HALF_UP), null, null);
List<ProductQueryDto> productQueryDtoList = List.of(productQueryDto);
when(productQueryService.getAllProducts()).thenReturn(productQueryDtoList);
RequestBuilder request = MockMvcRequestBuilders
.get("/api/adverts/product")
.accept(MediaType.APPLICATION_JSON);
mockMvc.perform(request).andReturn();
HashMap<String, Object> result = new HashMap<>();
result.put("products", productQueryDtoList);
String json = asJsonString(result);
mockMvc.perform(request)
.andExpect(status().is2xxSuccessful())
.andExpect(content().json(json, true))
.andExpect(jsonPath("$.products[0].price").value(new BigDecimal("100.00").setScale(2, RoundingMode.HALF_UP)))
.andReturn();
}
谢谢。
我刚刚通过将大小数设置为双倍来设法让测试通过。
BigDecimal bg = new BigDecimal("100.00").setScale(2, RoundingMode.HALF_UP);
String json = asJsonString(result);
mockMvc.perform(request)
.andExpect(status().is2xxSuccessful())
.andExpect(content().json(json, true))
.andExpect(jsonPath("$.products[0].price").value(bg.doubleValue()))
.andReturn();
添加 json 规范接受的数据类型的维基百科文章:
https://en.wikipedia.org/wiki/JSON
您要比较的值是双精度值。 JSON 不能合理地包含 BigDecimal,因为它不是规范的一部分。 JSON 可以包含数字 (double
) 值,这些值在数字上进行比较而忽略格式。没有合理的方法将您的 0.00
表示为双精度值——该值本身不包含尾随小数点——因此如果小数点很重要,您可能需要在客户端重新格式化或重新考虑您的方式首先传输信息。
另请参阅:Why not use Double or Float to represent currency?
我有一个 api,returns 产品的价格有两位小数,即使这些小数为零,即 100.00,也应该发生这种情况。但是,mockito 测试失败并删除了其中一个零,我不确定为什么。我试图强制刻度有两个零,但这也不起作用,即使 api 本身按预期工作。
@Test
public void testGetAllProductsOneItemOnlySo() throws Exception {
UUID productId = UUID.fromString("ac358df7-4a38-4ad0-b070-59adcd57dde0");
ProductQueryDto productQueryDto = new ProductQueryDto(productId, "product", "prod description", new BigDecimal("100.00").setScale(2, RoundingMode.HALF_UP), null, null);
List<ProductQueryDto> productQueryDtoList = List.of(productQueryDto);
when(productQueryService.getAllProducts()).thenReturn(productQueryDtoList);
RequestBuilder request = MockMvcRequestBuilders
.get("/api/adverts/product")
.accept(MediaType.APPLICATION_JSON);
mockMvc.perform(request).andReturn();
HashMap<String, Object> result = new HashMap<>();
result.put("products", productQueryDtoList);
String json = asJsonString(result);
mockMvc.perform(request)
.andExpect(status().is2xxSuccessful())
.andExpect(content().json(json, true))
.andExpect(jsonPath("$.products[0].price").value(new BigDecimal("100.00").setScale(2, RoundingMode.HALF_UP)))
.andReturn();
}
谢谢。
我刚刚通过将大小数设置为双倍来设法让测试通过。
BigDecimal bg = new BigDecimal("100.00").setScale(2, RoundingMode.HALF_UP);
String json = asJsonString(result);
mockMvc.perform(request)
.andExpect(status().is2xxSuccessful())
.andExpect(content().json(json, true))
.andExpect(jsonPath("$.products[0].price").value(bg.doubleValue()))
.andReturn();
添加 json 规范接受的数据类型的维基百科文章: https://en.wikipedia.org/wiki/JSON
您要比较的值是双精度值。 JSON 不能合理地包含 BigDecimal,因为它不是规范的一部分。 JSON 可以包含数字 (double
) 值,这些值在数字上进行比较而忽略格式。没有合理的方法将您的 0.00
表示为双精度值——该值本身不包含尾随小数点——因此如果小数点很重要,您可能需要在客户端重新格式化或重新考虑您的方式首先传输信息。
另请参阅:Why not use Double or Float to represent currency?