Я хочу проверить свой контроллер, если после входа в систему он установит поле входа в модель.В тесте я создаю объект LoginForm (просто объект с полем имени пользователя и пароля) и пытаюсь передать его в пост-запросе, но в контроллере LoginForm всегда есть нулевые значения.
Контроллер:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import pl.lpawliczak.mininstack.model.LoginForm;
import pl.lpawliczak.mininstack.service.UserService;
import pl.lpawliczak.mininstack.service.UserSession;
@Controller
public class LoginController {
private UserService userService;
@Autowired
public LoginController(UserService userService) {
this.userService = userService;
}
@GetMapping(value = "/login")
public String login() {
return "login-form";
}
@PostMapping(value = "/login")
public String login(LoginForm loginForm, Model model) {
UserSession user = userService.loginUser(loginForm);
if (user != null) {
model.addAttribute("login", loginForm.getUsername());
}
return "index";
}
}
Тест:
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import pl.lpawliczak.mininstack.model.LoginForm;
import pl.lpawliczak.mininstack.service.UserService;
import pl.lpawliczak.mininstack.service.UserSession;
import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
public class LoginControllerTest {
@Mock
private UserService userService;
private MockMvc mockMvc;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
this.mockMvc = MockMvcBuilders.standaloneSetup(new LoginController(userService)).build();
}
@Test
public void userShouldLogIn() throws Exception {
UserSession userSession = new UserSession();
userSession.setUserId(1L);
userSession.setUserLogin(true);
LoginForm loginForm = new LoginForm();
loginForm.setUsername("test");
when(userService.loginUser(loginForm)).thenReturn(userSession);
mockMvc.perform(post("/login", loginForm))
.andExpect(status().isOk())
.andExpect(model().attributeExists("login"));
}
}
Как я уже сказал, когда я пытаюсь отладить контроллер, LoginForm имеет нулевые значения, и я не представляю, что мне не хватает.
Ошибка после выполненияtest: java.lang.AssertionError: Model attribute 'login' does not exis
Может быть, будет лучше просто выполнить метод входа без выполнения пост-запроса?Но в этом случае я не знаю, как передать модель в метод