我有这样的图层:
Spring Controller -> 服务层 -> 道层 (JPA)。
我想写服务和 Controller 的测试用例。在另一个Junit中调用 Controller , Controller 调用服务,服务层获取数据库信息等。
在这种情况下,我不想模拟,我只想编写 junit 测试用例(我必须调用服务,服务必须从数据库中获取真实数据)。
我只有一个问题,服务层从 session 中获取用户 ID。我得到了带有 Autowiring 注释的 session 。如何在测试用例期间创建假 session ?
p.s 我认为模拟不适合我...因为我不习惯模拟我的服务,我想用真实的数据库数据创建 Controller 的真实调用...
最佳答案
我们可以用 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()方法,就会返回“当前” session 。
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));
}
关于java - 如何在 Spring Junit 中创建 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27102878/