restMockMvc — Ожидается: коллекция, содержащая , но: была

#java #spring #spring-boot #junit5

#java #весна #весенняя загрузка #junit5

Вопрос:

У меня проблема, когда я запускаю тест на конечной точке rest:

java.lang.Ошибка утверждения: путь в формате JSON «$.[*].montant»

Ожидается: коллекция, содержащая <1.0F>, но: была <1.0>

Ожидаемый: коллекция, содержащая <1.0F> Фактический: <1.0>

код:

 restMockMvc.perform(get("/api/{id}", dommage.getId()))
            .andExpect(status().isOk())
            .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE))
            .andExpect(jsonPath("$.[*].montant").value(hasItem(dommage.getMontant())));

 

Тест не удался, потому что значение не совпадает, но как я могу отформатировать результат json для сопоставления с плавающим значением или test is с текущим выводом?

Спасибо за вашу помощь

Комментарии:

1. Просто чтобы уточнить, ответ API равен «1.0», и вы ожидаете, что это будет «1.0F»? Я спросил, потому что атрибут — это число, нормально, что ответ 1.0

2. Это правильно, ответ API равен 1.0, но тест ожидает 1.0F, поэтому он не удался.

3. можете ли вы показать возвращаемый тип getMontant() метода?

4. Я использую аннотацию lombok для средства получения / установки, но свойство: private Float montant

5. Не могли бы вы попробовать что-то вроде этого «new DecimalFormat(«#.##»).format(dommage.getMontant())» в методе «hasItem»

Ответ №1:

Хорошо, я наконец нашел, как справиться с этой проблемой.

Перед тестированием я изменил JsonProvider по умолчанию с JsonSmartJsonProvider (по умолчанию) на JacksonJsonProvider.

Я сделал это с этим фрагментом кода во время инициализации теста:

      Configuration.setDefaults(new Configuration.Defaults() {

        private final JsonProvider jsonProvider = new JacksonJsonProvider();
        private final MappingProvider mappingProvider = new JacksonMappingProvider();

        @Override
        public JsonProvider jsonProvider() {
            return jsonProvider;
        }

        @Override
        public MappingProvider mappingProvider() {
            return mappingProvider;
        }

        @Override
        public Set<Option> options() {
            return EnumSet.noneOf(Option.class);
        }
    });
 

В дополнение к этому я изменил свой тест следующим образом:

 .andExpect(jsonPath("$.[*].montant", Float.class).value(hasItem(dommage.getMontant().doubleValue())));
 

Я использовал двойное значение, потому что ожидаемое значение равно 1.0F, а результат json равен 1.0.