Java 如何模拟HttpSession并将其作为arguemnt传递给使用会话的方法?
我正在使用SpringFramework 2.4.4和IntellijUltimate2020 我想测试这个方法Java 如何模拟HttpSession并将其作为arguemnt传递给使用会话的方法?,java,spring-boot,mocking,mockito,httpsession,Java,Spring Boot,Mocking,Mockito,Httpsession,我正在使用SpringFramework 2.4.4和IntellijUltimate2020 我想测试这个方法tryGetUser,我在这个方法上传递HttpSession,但是我无法解决这个问题,因为当我模拟它和setAttribute()时在方法的//Arrange部分,它总是以currentUserUserUserName为空结束 public User tryGetUser(HttpSession session) { String currentUserUsername =
tryGetUser
,我在这个方法上传递HttpSession,但是我无法解决这个问题,因为当我模拟它和setAttribute()时
在方法的//Arrange
部分,它总是以currentUserUserUserName
为空结束
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");
}
}
From answer不是这样工作的,所以您需要实际模拟调用,而不是设置属性
Mockito.when(mockHttpSession. getAttribute("currentUserUsername"))
.thenReturn("name");
而且HttpSession
应该用@Mock
而不是@InjectMocks
@Mock
HttpSession httpSession;
使用
MockHttpSession
,它是一个实际的真实对象(不仅仅是Mockito接口mock),正是为了进行这种类型的测试。它基本上是一个空的/空白的容器,所以你不必模仿所有的标准行为,只要用你想要的任何属性填充它即可。为什么你要重新发明身份验证而不是使用Spring Security?我不允许在这个项目中使用它。这个项目结束后,我必须独自学习。导师给我的理由是,在项目辩护前的几个小时,我的项目可能会很容易中断。谢谢你提供的信息和解决方案。成功了。