Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何模拟HttpSession并将其作为arguemnt传递给使用会话的方法?_Java_Spring Boot_Mocking_Mockito_Httpsession - Fatal编程技术网

Java 如何模拟HttpSession并将其作为arguemnt传递给使用会话的方法?

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 =

我正在使用SpringFramework 2.4.4和IntellijUltimate2020

我想测试这个方法
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?我不允许在这个项目中使用它。这个项目结束后,我必须独自学习。导师给我的理由是,在项目辩护前的几个小时,我的项目可能会很容易中断。谢谢你提供的信息和解决方案。成功了。