使用 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?