为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 MockMVC 帖子中将对象传递给 ModelAttrbiute?

如何在 MockMVC 帖子中将对象传递给 ModelAttrbiute?

一只甜甜圈 2021-12-30 16:17:26
用户模型:@Entity@Table(name="user")public class User {@Id @GeneratedValue(strategy=GenerationType.IDENTITY)private Integer id;@NotBlank@Column(name="username")private String username;@NotEmpty@ManyToMany(fetch = FetchType.EAGER)@JoinTable(name="user_role", joinColumns = {@JoinColumn(name="user_id")},                             inverseJoinColumns = {@JoinColumn(name="role_id")})private Set<Role> roles;}控制器:@RequestMapping(value = {"/users/edit/{id}"}, method = RequestMethod.POST)public String editUser(ModelMap model, @Valid @ModelAttribute("user") User user, BindingResult result) {    if(result.hasErrors()) {        return "AddUserView";    }    return "redirect:/users";}用 MockMVC 测试:@Testpublic void performUpdateUserTest() throws Throwable {            mockMvc.perform(post("/users/edit/{id}", user.getId())                   .param("username", "User"));}好吧,我可以像往常一样使用param()传递一个 param username。但是我应该怎么处理ROLES呢?该字段是一个单独的对象。我无法使用param()传递它。那怎么可能在测试中通过呢?我发现的唯一出路是创建一个实体并使用.flashAttr()传递它:    @Test    public void performUpdateUserTest() throws Throwable {          User user = new User("User", new HashSet<Role>(Arrays.asList(new Role("USER"))));          mockMvc.perform(post("/users/edit/{id}", user.getId())                 .flashAttr("user", user));    }但是,如果我需要测试由于ROLES字段中的绑定错误而无法更新用户(ROLES 不能为 null,假设它被设置为 null)怎么办?因此,我无法创建用户(并将其与 .flashAttr 一起使用)已经绑定错误,因为将抛出异常。而且还是要分开传。
查看完整描述

1 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

好吧,经过长时间的搜索,我发现我应该在MockMVC中添加一个转换器。例如,您可以在此处阅读什么转换器。我的项目中已经有了它,但没有意识到它不适用于 MockMVC。


因此,您可以像这样将转换器添加到 MockMVC:


    @Autowired

    private StringToRoleConverter stringToRoleConverter;


    @Before

    public void init() {

        FormattingConversionService cs = new FormattingConversionService();

        cs.addConverter(stringToRoleConverter);


        mockMvc = MockMvcBuilders.standaloneSetup(userController)

                .setConversionService(cs)

                .build();

    }

转换器本身:


@Component

public class StringToRoleConverter implements Converter<String, Role> {


    @Autowired

    private RoleService roleService;


    @Override

    public Role convert(String id) {

        Role role = roleService.findById(Integer.valueOf(id));


        return role;

    }


}

然后我可以添加这样的参数:


mockMvc.perform(post("/users/edit/{id}", user.getId())

        .param("roles", "2"))

尽管我在那里传递了一个字符串,但它将在 Spring 转换器的帮助下转换为 Role。


查看完整回答
反对 回复 2021-12-30
  • 1 回答
  • 0 关注
  • 257 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信