【问题标题】:mvc controller test with session attribute具有会话属性的 mvc 控制器测试
【发布时间】:2020-06-02 02:04:19
【问题描述】:

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

 @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。

我应该如何处理会话属性,我的方法不接受会话参数,并且为每个测试创建一个带有新会话的 WebApplicationContext。

【问题讨论】:

    标签: spring-mvc controller attributes junit4 httpsession


    【解决方案1】:

    试试这个:

    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());
    

    【讨论】:

      【解决方案2】:

      您还可以跨不同请求共享会话:

      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 实例执行的请求之间共享。

      【讨论】:

      • 在我的 @SpringBootTest 测试类中自动装配应用程序上下文 @Autowired private WebApplicationContext webApplicationContext; 后,此方法有效。
      猜你喜欢
      • 2015-09-23
      • 2016-11-25
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      相关资源
      最近更新 更多