Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.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 如何在Spring Junit中创建会话_Java_Spring_Unit Testing_Junit_Spring Test - Fatal编程技术网

Java 如何在Spring Junit中创建会话

Java 如何在Spring Junit中创建会话,java,spring,unit-testing,junit,spring-test,Java,Spring,Unit Testing,Junit,Spring Test,我有这样的层次: Spring控制器->服务层->Dao层(JPA) 我想编写服务和控制器的测试用例。在另一个Junit将调用控制器,控制器将调用服务,服务层获取数据库信息等 在本例中,我不想模拟,我只想编写junit测试用例(我必须调用服务,服务必须从数据库获取真实数据) 我只有一个问题,服务层从会话获取用户id。我使用自动连线批注获取会话。如何在测试用例期间创建假会话 p、 我觉得mock不适合我。。。因为我不习惯模拟我的服务,我想用真实的db数据创建控制器的真实调用…您可以使用MockHt

我有这样的层次:

Spring控制器->服务层->Dao层(JPA)

我想编写服务和控制器的测试用例。在另一个Junit将调用控制器,控制器将调用服务,服务层获取数据库信息等

在本例中,我不想模拟,我只想编写junit测试用例(我必须调用服务,服务必须从数据库获取真实数据)

我只有一个问题,服务层从会话获取用户id。我使用自动连线批注获取会话。如何在测试用例期间创建假会话


p、 我觉得mock不适合我。。。因为我不习惯模拟我的服务,我想用真实的db数据创建控制器的真实调用…

您可以使用MockHttpSession:

更多信息请点击此处:

一个选项是使用SpEL表达式将用户ID(而不是
HttpSession
)注入到服务组件中。要实现正确的运行时行为,必须确保服务组件是AOP范围的代理

有关更多信息,请参阅弹簧参考手册的章节

问候,


Sam(
spring test
component lead)

我们可以使用mock。下面是代码示例

private MockMvc mockMvc;

        @Autowired
        private FilterChainProxy springSecurityFilterChain;

        @Autowired
        private WebApplicationContext wac;

        protected MockHttpSession session;

        protected MockHttpServletRequest request;

        @Before
        public void setup() {
            this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).addFilters(this.springSecurityFilterChain).build();
        }

        @Test
        void test(){
        // I log in and then returns session 
        HttpSession session = mockMvc.perform(post("/j_spring_security_check").param("NAME", user).param("PASSWORD", pass))
                    .andDo(print()).andExpect(status().isMovedTemporarily()).andReturn().getRequest().getSession();
        }
我们也可以这样做,只需调用startSession()方法,就会返回“当前”会话

protected void startSession() {
        session = new MockHttpSession();
    }

    protected void endSession() {
        session.clearAttributes();
        session = null;
    }

    // we can create request too, just simple way
    protected void startRequest() {
        request = new MockHttpServletRequest();
        request.setSession(session);
        RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));
    }

在使用mongo会话存储时,我编写了以下函数来创建“真实”会话

private Session generateMongoHttpSession(final Role role, final Permission... permissions) {
  final Set<GrantedAuthority> authorities =
    role.getPermissions()
        .stream()
        .map(p -> new SimpleGrantedAuthority(p.toString()))
        .collect(Collectors.toSet());

  Arrays.stream(permissions)
    .forEach(p -> authorities.add(new SimpleGrantedAuthority(p.toString())));

  final UserDetails userDetails =
    new org.springframework.security.core.userdetails.User(
        "test-user-name", "test-password", true, true, true, true, authorities);

  final Authentication authentication =
    new UsernamePasswordAuthenticationToken(
        userDetails, userDetails.getPassword(), userDetails.getAuthorities());

  final UsernamePasswordAuthenticationToken authenticationToken =
    new UsernamePasswordAuthenticationToken(
          userDetails, authentication.getCredentials(), userDetails.getAuthorities());
  authenticationToken.setDetails(authentication.getDetails());

  final SecurityContextImpl context = new SecurityContextImpl();
  context.setAuthentication(authentication);

  final MongoExpiringSession session = mongoOperationsSessionRepository.createSession();
  session.setAttribute("SPRING_SECURITY_CONTEXT", context);
  session.setAttribute("sessionId", session.getId());
  mongoOperationsSessionRepository.save(session);

  return session;
}
专用会话generateMongoHttpSession(最终角色、最终权限…权限){
最终设定权限=
role.getPermissions()
.stream()
.map(p->new SimpleGrantedAuthority(p.toString()))
.collect(收集器.toSet());
Arrays.stream(权限)
.forEach(p->authorities.add(新的SimpleGrantedAuthority(p.toString()));
最终用户详细信息用户详细信息=
新org.springframework.security.core.userdetails.User(
“测试用户名”、“测试密码”、true、true、true、true、authorities);
最终身份验证=
新用户名PasswordAuthenticationToken(
userDetails、userDetails.getPassword()、userDetails.getAuthorities());
最终用户名PasswordAuthenticationToken authenticationToken=
新用户名PasswordAuthenticationToken(
userDetails、authentication.getCredentials()、userDetails.getAuthories());
authenticationToken.setDetails(authentication.getDetails());
最终SecurityContextImpl上下文=新SecurityContextImpl();
setAuthentication(身份验证);
最终MongoExpiringSession会话=mongoOperationsSessionRepository.createSession();
setAttribute(“SPRING\u SECURITY\u CONTEXT”,CONTEXT);
session.setAttribute(“sessionId”,session.getId());
mongoOperationsSessionRepository.save(会话);
返回会议;
}

它是一个会话范围包含用户数据的bean吗?您的服务层组件是一个会话范围bean吗?另外,您是否对使用
Spring MVC测试框架感兴趣?
?我不会模仿。因为我调用了this.mockMvc.perform(我的控制器),mock不会调用我的服务层。这是我的问题,我在使用mock时是指这个问题,所以我不会mock:如果您将用户id存储为会话的一个属性,那么您也可以在
MockHttpSession
上设置它。然后,当您的代码使用该对象时,它将返回您希望它返回的任何值。