Выполнить запись в mock mvc не передает param объект - PullRequest
0 голосов
/ 18 июня 2019

Я хочу проверить свой контроллер, если после входа в систему он установит поле входа в модель.В тесте я создаю объект 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

Может быть, будет лучше просто выполнить метод входа без выполнения пост-запроса?Но в этом случае я не знаю, как передать модель в метод

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...