具有会话属性的mvc控制器测试

问题描述 投票:3回答:2

我正在尝试使用此签名测试方法:

 @Autowired
HttpSession http_Session;
@RequestMapping(method=RequestMethod.GET, value="/search/findByName")
public @ResponseBody List<Map> search(@RequestParam(value="name", required=true) String name){
Integer user_id = http_Session.getAttribute("userinfo");
}

userinfo是一个类,其中包含有关用户的信息,并在用户登录时在会话范围内进行设置。但是当我尝试测试时:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration 
@ContextConfiguration(locations = {
   "classpath:/META-INF/applicationContext.xml"})

 public class userControllerTest {

private MockMvc mockMvc;  
@Autowired
private WebApplicationContext webApplicationContext;

@Before 
public void setUp() {
    MockitoAnnotations.initMocks(this);
    this.mockMvc = MockMvcBuilders.webAppContextSetup(this.webApplicationContext).build();
 }  
 @Test
 public void userTest() throws Exception {
     mockMvc.perform(MockMvcRequestBuilders.get("/search/findByName").param("name", "bob"))
          .andDo(print())
          .andExpect(MockMvcResultMatchers.status().isOk());
    }

问题是在另一个方法中设置了userinfo类属性,因此当我尝试在此方法中访问它时,我得到了NullPointerException,并且通过自动装配httpSession我为要测试的每个方法都获得了一个新的Session。

我应该使用session属性做什么,我的方法不接受session参数,并且为每个测试创建一个带有新会话的WebApplicationContext。

spring-mvc controller attributes junit4 httpsession
2个回答
14
投票

尝试一下:

HashMap<String, Object> sessionattr = new HashMap<String, Object>();
sessionattr.put("userinfo", "XXXXXXXX");

mockMvc.perform(MockMvcRequestBuilders.get("/search/findByName").sessionAttrs(sessionattr).param("name", "bob"))
          .andDo(print())
          .andExpect(MockMvcResultMatchers.status().isOk());

0
投票

您也可以在不同的请求之间共享会话:

import static org.springframework.test.web.servlet.setup.SharedHttpSessionConfigurer.sharedHttpSession;

@Before 
public void setUp() {
    this.mockMvc = MockMvcBuilders
    .webAppContextSetup(this.webApplicationContext)
    .apply(sharedHttpSession()) // use this session across requests
    .build();
}

注意:此会话将仅在针对同一MockMvc实例执行的请求之间共享。

© www.soinside.com 2019 - 2024. All rights reserved.