【问题标题】:Send list to controller with MockMvc使用 MockMvc 将列表发送到控制器
【发布时间】:2016-02-01 19:38:06
【问题描述】:

我想在表单的另一个对象中发送一个列表。在这种情况下,它是具有角色列表的用户。 在表单上,​​我有一个选择多个发送角色 ID 列表。 我有一个带有 RoleFormatter 的自定义 FormatterRegistrar。这是我的代码:

我的模特:

@Entity
@Table(name = "USER")
@SequenceGenerator(name = "user_seq", sequenceName = "user_seq", initialValue = 1)
public class User implements Serializable {

    @Id
    @GeneratedValue(generator = "user_seq", strategy = GenerationType.SEQUENCE)
    private Long id;

    @NotEmpty
    @Size(min = 1, max = 50)
    @Column(name = "codigo", nullable = false)
    private String codigo;

    @Size(min = 3, max = 50)
    @Column(name = "name")
    private String name;

    ....

    @NotNull
    @NotEmpty
    @ManyToMany
    @JoinTable(name = "user_roles",
        joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") },
        inverseJoinColumns = { @JoinColumn(name = "role_id", referencedColumnName = "id") }
    )
    private Set<Role> roles = new HashSet<>();  


    //getters & setters
}

我的控制器:

@Controller
@SessionAttributes("user)
@RequestMapping(value = "/users")
public class UserController {

    @PreAuthorize("hasAuthority('users.admin')")
    @RequestMapping(value = "update", method = RequestMethod.POST)
    public String save(@Valid @ModelAttribute User user, BindingResult result, SessionStatus status, RedirectAttributes ra,
            HttpServletRequest request) {

        //Save user

        return "detail";
    }

}

我的测试:

public class UserControllerTest {

    @Mock
    private UserService userService;

    @InjectMocks
    private UserController userController;

    private MockMvc mockMvc;

    @Before
    public void setup() {
        // Process mock annotations
        MockitoAnnotations.initMocks(this);

        // Setup Spring test in standalone mode
        this.mockMvc = MockMvcBuilders.standaloneSetup(userController)
                .setCustomArgumentResolvers(new PageableHandlerMethodArgumentResolver()).build();
    }


    @Test
    public void testSave() throws Exception {
        User user = new User();

        // Without errors
        this.mockMvc.perform(post("/users/update")
                .param("id", "1")
                .param("name", "Jonh")
                .param("roles.id", "1", "2")
                .sessionAttr("user", user))
                .andExpect(view().name("detail"))
                .andExpect(model().hasNoErrors()));
    }
}

通过这个测试,我总是得到空角色。如何提交 id 列表?如何发送列表?

【问题讨论】:

  • 如果你的测试类使用@RunWith(MockitoJUnitRunner.class)运行,你不应该使用mockMvc(因为我看到代码使用@Mock@InjectMocks)。当您加载 Spring 上下文 (@RunWith(SpringJUnit4ClassRunner.class)) 时,MockMvc 很有用。我认为您可以创建一个新的 UserController 并直接使用参数调用 save 方法:userController.save(...);
  • @DamienBeaufils 可以将自定义运行器与MockMvcBuilders.standaloneSetup 一起使用,您所说的对于 MockMvcBuilders.webAppContextSetup 来说是正确的
  • 我认为我的做法是正确的,但不是如何发送角色标识符列表。这是正确的方法,因为它直接调用 url 而不是方法,我认为... @DamienBeaufils
  • 你做到了吗?这可能是不可能的。你可以用一个列表来代替

标签: java spring junit mockito mockmvc


【解决方案1】:

这个答案可能有点晚了,但我最近找到了解决这个问题的方法。

我遇到了同样的问题并搜索了不同的博客,我找到了这个库:https://github.com/f-lopes/spring-mvc-test-utils

只需将库导入您的项目和用户测试中,您必须这样做:

//here, the method might be called 'save' or 'update'. You just put in there the name of the method for updating a user
doNothing().when(userService).save(any(User.class));

User user = new User();
//set user's properties
user.setRoles(Arrays.asList(
    new Role(), //here you set role's properties
    new Role() //here as well
));

//here comes the magic
mockMvc.perform(postForm("/users/update", user))
       .andExpect(view().name("detail"))
       .andExpect(model().hasNoErrors()));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 2016-01-11
    • 2014-04-16
    • 2018-03-10
    • 2020-08-09
    相关资源
    最近更新 更多