首页 > 解决方案 > 如何模拟 HttpSession 并将其作为参数传递给与会话一起使用的方法?

问题描述

我正在使用 Spring 框架 2.4.4 和 Intellij Ultimate 2020

我想测试tryGetUser传递 HttpSession 的这个方法,但我无法解决问题,因为当我模拟它时,setAttribute();在方法的//Arrange一部分它总是currentUserUsername以 null 结尾。

public User tryGetUser(HttpSession session) {
    String currentUserUsername = (String) session.getAttribute("currentUserUsername");
***// Here this local variable currentUsername is always null;***
    if (currentUserUsername == null) {
        throw new AuthorizationException("No logged in user.");
    }

    try {
        return userService.getByUsername(currentUserUsername);
    } catch (EntityNotFoundException e) {
        throw new AuthorizationException("No logged in user.");
    }
}

在这里您可以看到我是如何尝试模拟它的,但实际上,会话保持为空或者我不知道,但是当服务方法开始执行该属性时不存在。

@ExtendWith(MockitoExtension.class)
public class LoginServiceMvcTests {

    @Mock
    UserRepository mockUserRepository;

    @Mock
    UserService mockUserService;

    @InjectMocks
    MockHttpSession mockHttpSession;

    @InjectMocks
    LoginServiceMvc userService;

    private User junkie;
    private User organizer;

    @BeforeEach
    public void setup() {
        junkie = Helpers.createJunkie();
        organizer = Helpers.createOrganizer();
    }

    @Test
    public void tryGetUser_Should_GetUserFromSession_When_UserIsLogged() {

        // Arrange
        mockHttpSession.setAttribute("luboslav", junkie);
        Mockito.when(mockUserService.getByUsername("luboslav"))
                .thenReturn(junkie);

        // Act
        userService.tryGetUser(mockHttpSession);

        // Assert
        Mockito.verify(mockUserService, Mockito.times(1))
                .getByUsername("luboslav");
    }
}

标签: javaspring-bootmockingmockitohttpsession

解决方案


来自Jon skeet的回答Mockito不是那样工作的,所以你需要实际模拟调用而不是设置属性

Mockito.when(mockHttpSession. getAttribute("currentUserUsername"))
            .thenReturn("name");

并且还HttpSession应该用@Mocknot注释@InjectMocks

@Mock
HttpSession httpSession;

推荐阅读