亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 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 關注
  • 275 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號