java - 如何模拟 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");
}
}
解决方案
推荐阅读
- node.js - ESLint 与 eslint-plugin-import 和 typescript-eslint 冲突
- amazon-web-services - Terraform - aws_lambda_permission APIGW 源 ARN 格式示例停止工作
- angular - Angular 9 的 fullTemplateTypeCheck。不兼容的类型
- php - 是否可以从不同的 URL 删除文件?
- flutter - 为什么滚动方向水平不起作用?
- javascript - 有决心,拒绝新的承诺和没有它有什么区别?
- java - 如何在 Eclipse 之外运行的 Tomcat Web 应用程序中执行热代码替换?
- r - 如何减少R中逻辑回归模型中的分类变量
- angular - Angular Material 9.1.3 中缺少 Angular Mat Table renderRow()
- javascript - 根据第一个问题选择的性别显示不同的形式