Tvrdí, BigDecimal s dva koncové nuly pomocí Mockito

0

Otázka

Mám api, které vrátí cenu za produkt, na dvě desetinná místa a to by se mělo stát, i když tyto desetinných míst jsou nuly, jsem.e, 100.00. Nicméně, mockito testy selhávají a odizolování jedné z těchto nul a nejsem si jistý, proč. Snažil jsem se nutit měřítko, aby dvě nuly, ale to taky nešlo, i když api samo o sobě funguje, jak se očekávalo.

@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();
}

enter image description here

enter image description here

Děkuji.

assertion bigdecimal java mockito
2021-11-23 06:40:30
2

Nejlepší odpověď

1

Hodnota srovnáváš proti je dvojí. JSON nemůže přiměřeně obsahovat BigDecimal, protože to není součást spec. JSON mohou obsahovat Číslo (double) hodnoty, které jsou porovnány numericky bez ohledu formátování. Neexistuje žádný rozumný způsob, jak reprezentovat svou 0.00 jako double—hodnota sama o sobě neobsahuje koncové desetinné číslo—takže pokud by desetinná čárka body jsou důležité, možná budete muset přeformátovat na straně klienta nebo přehodnotit způsob, jakým se přepravuje informace na prvním místě.

Viz také: Proč používat Double nebo Float představují měnu?

2021-11-23 17:38:44
0

Jen jsem se podařilo dostat na testy projít nastavením velký desetinné číslo na double.

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

Přidání článku na wikipedii, na které typy dat jsou přijímány json specifikace: https://en.wikipedia.org/wiki/JSON

enter image description here

2021-11-24 04:52:32

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................