Исключение не выдается при использовании метода DoThrow от Mockito - PullRequest
0 голосов
/ 12 февраля 2019

Я работаю с поддельным объектом, подобным следующему:

@Mock
private RecipeService recipeService

У меня также есть следующий метод внутри класса тестирования:

    @Test
    public void testAddRecipeWithNonUniqueName() throws Exception {
        Recipe recipe = new Recipe();

        doThrow(Exception.class)
                .when(recipeService)
                .save(recipe);

        mockMvc.perform(post("/recipes/add-recipe")
                .contentType(MediaType.APPLICATION_FORM_URLENCODED)
                .param("id", "1")
                .param("name", "recipe1"))
                .andExpect(status().is3xxRedirection())
                .andExpect(view().name("redirect:/recipes/add"));
    }

Как видите, яиспользование метода doThrow mockito для определения того, какое исключение будет вызвано при вызове метода void с именем save.

Я хочу сделать запрос POST, используя объект MockMvc.Поэтому метод, помеченный конечной точкой /recipes/add-recipe, будет вызываться внутри одного из моих классов контроллеров.Следующий фрагмент кода показывает этот метод подробно:

    @RequestMapping(value = "/recipes/add-recipe", method = RequestMethod.POST)
    public String addRecipe(@Valid Recipe recipe, BindingResult result, RedirectAttributes redirectAttributes,
                            @AuthenticationPrincipal User user){

       String response = validateFormValues(recipe, redirectAttributes, result,
               "redirect:/recipes/add");
       if(!response.isEmpty())return response;

        recipe.setUser(user);

        try {
            recipeService.save(recipe);
        }catch(Exception e){
            redirectAttributes.addFlashAttribute("uniqueConstraintError",
                    String.format("The name \"%s\" is already taken by another recipe. " +
                                    "Please try again!",
                            recipe.getName()));
            return "redirect:/recipes/add";
        }

        setUserForIngredientsAndSteps(recipe);

        redirectAttributes.addFlashAttribute("flash",
                new FlashMessage("The recipe has been added successfully!", FlashMessage.Status.SUCCESS));
        return String.format("redirect:/recipes/%s/detail", recipe.getId());
    }

Вышеуказанный метод содержит блок try-catch .Когда вызывается recipeService.save(), я ожидаю, что будет сгенерировано исключение, которое будет обработано блоком catch. Но этого не происходит. Вместо этого выполняются другие строки.

Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019
Recipe recipe = new Recipe();

doThrow(Exception.class)
        .when(recipeService)
        .save(recipe);

Этот код будет работать, только если точно такой же экземпляр Recipe передан методу сохранения.Если вы внедрили метод equals и / или hashCode, передав ему экземпляр Recipe, если ожидаемые значения 1 и name могут заставить его работать.

Recipe recipe = new Recipe();
recipe.setId(1);
recipe.setName("name");

doThrow(Exception.class)
        .when(recipeService)
        .save(recipe);

Однако, поскольку вы, вероятно, захотите проверить ситуацию с ошибкой, вероятно, всегда проще вызвать исключение.Для этого используйте устройство сопоставления any().

doThrow(Exception.class)
        .when(recipeService)
        .save(any(Recipe.class);

Теперь при вызове save независимо от переданного в Recipe будет сгенерировано исключение.

0 голосов
/ 12 февраля 2019

метод doTrhow(), который вы вызываете, запускается только тогда, когда вы сохраняете определенный рецепт, который вы создали ранее.

Вы должны указать Mockito добавить любой рецепт

Mockito.doThrow(Exception.class)
            .when(recipeService)
            .save(Mockito.any(Recipe.class));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...