【发布时间】: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