如何正确实现attributeHasFieldErrors(没有'AssertionError:No BindingResult for attribute:abc'错误)

时间:2017-12-30 17:46:02

标签: junit spring-test spring-boot-test

我正在尝试在单元测试中使用.andExpect(model().attributeHasFieldErrors

根据this page java.lang.AssertionError:没有BindingResult属性:abc是由于受测试的控制器返回的视图是重定向:“redirect:/ xyz / add”。

但与此同时,大部分@PostMapping(/...)都使用重定向。这是否意味着在这种情况下无法知道attributeHasFieldErrors

似乎有可能 - 在这sample它似乎有效 - 但我对此感到困惑:

testProcessUpdateOwnerFormHasErrors测试方法(上面链接中的底层的第二个方法)执行POST [ i.e. mockMvc.perform(post(... ],并期望在Controller类中由GET方法返回的视图名称。

也就是说,@GetMapping("/owners/{ownerId}/edit")返回"owners/createOrUpdateOwnerForm"@PostMapping("/owners/{ownerId}/edit")在Controller中返回"redirect:/owners/{ownerId}"。以上测试执行POST期望"owners/createOrUpdateOwnerForm"。不应该期待"redirect:/owners/{ownerId}"吗?

我很困惑。

有人可以解释实施attributeHasFieldErrors的正确方法吗?

1 个答案:

答案 0 :(得分:0)

通常,在没有错误的情况下使用重定向,以避免出现多个POSTS。什么时候 出现错误,正常的处理方法是重新显示带有错误消息的相同视图。

类似的东西:

    @PostMapping("/")
    public String processForm(@Valid UserForm userForm, BindingResult bindingResult, Model model) {
        if ( ! bindingResult.hasErrors()) {         
            Long id = service.saveUser(userForm.getUser()); 
            return "redirect:/user/"+id;
        } else {
          return "calcForm";
        }
    }