java.lang.AssertionError: Нет значения в пути JSON - PullRequest
1 голос
/ 15 апреля 2019

Я запускаю модульный тест, в котором я хотел бы получить объект JSON и мне нужно сравнить его со значениями.Конечная точка указана ниже,

private static final String TOTAL_REWARD = "total_reward_";
private static final String EUR = "EUR";

@GetMapping(value = "/findUsersPayouts")
    public ResponseEntity<String> findUsersPayoutList(@RequestParam("userId") Long userId) {

        Optional<User> optional = userService.findById(userId);

        if (!optional.isPresent()) {
            return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
        }

        User user = optional.get();

        List<Reward> rewards = user.getRewards();


        JSONObject obj = new JSONObject();

        obj.put("id", user.getId());
        obj.put("name", user.getName());

        JSONArray array = new JSONArray();

        for (Reward reward : rewards) {

            JSONObject currData = new JSONObject();

            double amount = reward.getAmount();
            String currencyName = user.getCurrencyName();

            Map<String, Double> currencyMap = currencyUtilities.getCurrencyMap();

            currData.put(TOTAL_REWARD + EUR, amount);


            /*
             * convert the reward amount to 2 decimals limit
             * */
            DecimalFormat df = new DecimalFormat("#.00");

            double rewardInLocalCurrency = amount * currencyMap.get(currencyName);
            String rewd = df.format(rewardInLocalCurrency);

            currData.put(TOTAL_REWARD + currencyName, rewd);
            array.put(currData);
        }

        obj.put("rewards", array);
        return ResponseEntity.status(HttpStatus.CREATED).contentType(MediaType.APPLICATION_JSON_UTF8).body(obj.toString());
    }

У меня здесь тест,

@Test
    public void findUsersPayoutList() throws Exception {

        when(userService.findById(any(Long.class))).thenReturn(Optional.of(user));

        Reward reward = new Reward();
        reward.setUser(user);
        reward.setId(55L);
        reward.setAmount(1);

        Reward reward1 = new Reward();
        reward1.setUser(user);
        reward1.setId(57L);
        reward1.setAmount(1);

        user.addReward(reward);
        user.addReward(reward1);

        Map<String, Double> map = new HashMap<>();
        map.put("EUR", 1.0);

        when(currencyUtilities.getCurrencyMap()).thenReturn(map);
        JSONArray rewards = new JSONArray();
        JSONObject object = new JSONObject();
        object.put("total_reward_EUR :", 1);

        rewards.put(object);
        rewards.put(object);

        mockMvc.perform(get("/api/v1/users/findUsersPayouts").param("userId", String.valueOf(user.getId())))
                .andExpect(
                        status().isCreated()
                ).andExpect(
                content().contentType(MediaType.APPLICATION_JSON_UTF8)
        ).andDo(print())
                .andExpect(
                        jsonPath("$.id", is(user.getId().intValue()))
                ).andExpect(
                jsonPath("$.name", is(user.getName()))
        ).andExpect(
                jsonPath("$.rewards[0].['total_reward_EUR :']", is("1.00"))
        ).andExpect(
                jsonPath("$.rewards[1].['total_reward_EUR :']", is("1.00"))
        );
    }

Когда я запускаю тест, я получаю вывод,

java.lang.AssertionError: нет значения по пути JSON "$ .rewards [0]. ['Total_reward_EUR:']"

Я отлаживаю и получаю указанное значение,

enter image description here

Что здесь не так с тестом?

1 Ответ

1 голос
/ 15 апреля 2019

Вы должны использовать его как $.rewards[0].['total_reward_EUR'] для доступа к свойству total_reward_EUR первого объекта в массиве rewards в вашем json.

...