首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何模拟HttpSession并将其作为参数传递给与session一起工作的方法?

如何模拟HttpSession并将其作为参数传递给与session一起工作的方法?
EN

Stack Overflow用户
提问于 2021-04-06 09:03:46
回答 2查看 255关注 0票数 2

我使用的是Spring framework 2.4.4和Intellij Ultimate 2020

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

代码语言:javascript
运行
复制
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.");
    }
}

在这里,您可以看到我是如何尝试Mock它的,但实际上,会话仍然是空的,或者我不知道,但是当服务方法开始执行时,属性不在那里。

代码语言:javascript
运行
复制
@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");
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-06 09:34:41

Jon skeet answer中,Mockito不是这样工作的,所以您需要实际模拟调用,而不是设置属性

代码语言:javascript
运行
复制
Mockito.when(mockHttpSession. getAttribute("currentUserUsername"))
            .thenReturn("name");

另外,HttpSession应该使用@Mock而不是@InjectMocks进行标注

代码语言:javascript
运行
复制
@Mock
HttpSession httpSession;
票数 1
EN

Stack Overflow用户

发布于 2021-04-06 10:07:34

使用MockHttpSession,它是一个实际的真实对象(而不仅仅是Mockito接口模拟),它正是为了这种类型的测试而设计的。它基本上是一个空/空的容器,所以你不必模拟所有的标准行为,只需用你想要的任何属性填充它即可。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66961507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档