Так что вопрос немного странный, но здесь задействовано так много вещей, что я не знаю, как его спросить:)
Итак, давайте начнем с верха.
Для удобства чтения я удалил большую часть кода.
На моей странице Thymeleaf есть следующее:
<form th:action="@{/admin/addAdmin}" th:object="${adminDTO}" method="post">
<select th:field="*{userRole}">
<option value="">Select</option>
<option th:each="eot : ${userRoleList}" th:value="${eot.roleId}" th:text="${eot.roleDesc}"></option>
</select>
</form>
Мой класс AdminDTO:
public class AdminDTO {
private String userName;
@NotNull
private UserRole userRole;
//Getter and Setters
UserRole - это класс Database Entity, и он выглядит примерно так:
@Entity
@Table(name = "user_role")
public class UserRole implements Serializable {
@Id
@Column(name = "role_id")
private long roleId;
@NotBlank
@Column(name = "role_desc")
private String roleDesc;
//Getter and Setters
Мой класс контроллера:
@PostMapping("/admin/addAdmin")
public String postAddAdmin(Model model, @Valid @ModelAttribute("adminDTO") AdminDTO adminDTO, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
model.addAttribute("error", "Please complete all fields correctly!");
return "/admin/addAdmin";
} else {
model.addAttribute("success", "NICE!!");
return "/admin/addAdmin";
}
}
Когда я тестирую этот код, работающий в Tomcat и использующий мой браузер, онработает отлично. При выборе роли пользователя на html-странице Thymeleaf и ее отправке передается идентификатор роли пользователя, равный 1, и где-то перед попаданием в контроллер объект UserRole сопоставляется с объектом UserDTP. BindingResult не имеет ошибок, и все работает хорошо.
Но когда я пытаюсь проверить это с помощью класса Test, приведенного ниже, то BindingResult имеет ошибки, касающиеся UserRole, не может быть нулевым.
Мой тестовый класс / метод:
@Test
public void postAddAdmin() throws Exception {
this.mockMvc.perform(post("/admin/addAdmin")
.param("userName", "User")
.param("userRole", "1"))
.andExpect(status().isOk())
.andExpect(view().name("/admin/addAdmin"));
}
Этот тест завершается неудачно с UserRole, равным нулю, когда он попадает в контроллер.
Итак, мой вопрос состоит из двух частей: 1. Как происходит автоматическое связывание при отправке с использованиемформа Thymeleaf? 2. Почему мой тест не выполняет ту же функцию автоматического связывания и как я могу это исправить?
Надеюсь, я все это рассмотрел, поэтому, пожалуйста, спросите, нужно ли мне что-то изменить или обновить.
Спасибо