簡體   English   中英

如何在MockMVC帖子中將對象傳遞給ModelAttrbiute?

[英]How to pass an object to a ModelAttrbiute in MockMVC post?

用戶模型:

@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測試:

@Test
public void performUpdateUserTest() throws Throwable {
            mockMvc.perform(post("/users/edit/{id}", user.getId())
                   .param("username", "User"));
}

好吧,我可以像往常一樣使用param()傳遞參數用戶名 但是我應該做的角色 該字段是一個單獨的對象。 我不能使用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結合使用),因為將引發異常。 而且我仍然必須單獨通過它。

好了,經過長時間的搜索,我發現我應該在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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM