我正在使用3.1版本中的新Spring测试来运行集成测试。它工作得很好,但我无法使会话正常工作。我的代码:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration("src/main/webapp")
@ContextConfiguration({"classpath:applicationContext-dataSource.xml",
"classpath:applicationContext.xml",
"classpath:applicationContext-security-roles.xml",
"classpath:applicationContext-security-web.xml",
"classpath:applicationContext-web.xml"})
public class SpringTestBase {
@Autowired
private WebApplicationContext wac;
@Autowired
private FilterChainProxy springSecurityFilterChain;
@Autowired
private SessionFactory sessionFactory;
protected MockMvc mock;
protected MockHttpSession mockSession;
@Before
public void setUp() throws Exception {
initDataSources("dataSource.properties");
mock = MockMvcBuilders.webAppContextSetup(wac).addFilters(springSecurityFilterChain).build();
mockSession = new MockHttpSession(wac.getServletContext(), UUID.randomUUID().toString());
}
@Test
public void testLogin() throws Exception {
// this controller sets a variable in the session
mock.perform(get("/")
.session(mockSession))
.andExpect(model().attributeExists("csrf"));
// I set another variable here just to be sure
mockSession.setAttribute(CSRFHandlerInterceptor.CSRF, csrf);
// this call returns 403 instead of 200 because the session is empty...
mock.perform(post("/setup/language")
.session(mockSession)
.param(CSRFHandlerInterceptor.CSRF, csrf)
.param("language", "de"))
.andExpect(status().isOk());
}
}
我的会话在每个请求中都是空的,我不知道为什么。
编辑:最后一个断言失败:andExect(status(). isOk());
。它返回403而不是200。
我以一种有点迂回的方式做了这件事——不过很管用。我所做的是让Spring Security创建一个会话,该会话中填充了相关的安全属性,然后以这种方式获取该会话:
this.mockMvc.perform(post("/j_spring_security_check")
.param("j_username", "fred")
.param("j_password", "fredspassword"))
.andExpect(status().isMovedTemporarily())
.andDo(new ResultHandler() {
@Override
public void handle(MvcResult result) throws Exception {
sessionHolder.setSession(new SessionWrapper(result.getRequest().getSession()));
}
});
SessionHolder是我的自定义类,仅用于举行会话:
private static final class SessionHolder{
private SessionWrapper session;
public SessionWrapper getSession() {
return session;
}
public void setSession(SessionWrapper session) {
this.session = session;
}
}
SessionWrapper是另一个从MockHttp会话扩展而来的类,只是因为会话方法需要MockHttp会话:
private static class SessionWrapper extends MockHttpSession{
private final HttpSession httpSession;
public SessionWrapper(HttpSession httpSession){
this.httpSession = httpSession;
}
@Override
public Object getAttribute(String name) {
return this.httpSession.getAttribute(name);
}
}
有了这些设置,现在您可以简单地从sesionHolder中获取会话并执行后续方法,例如。在我的例子中:
mockMvc.perform(get("/membersjson/1").contentType(MediaType.APPLICATION_JSON).session(sessionHolder.getSession()))
.andExpect(status().isOk())
.andExpect(content().string(containsString("OneUpdated")));
更新的答案:
似乎在构建器中添加了一个新方法“setsionAttrs”(请参阅带有会话属性的mvc控制器测试)
Map<String, Object> sessionAttrs = new HashMap<>();
sessionAttrs.put("sessionAttrName", "sessionAttrValue");
mockMvc.perform(MockMvcRequestBuilders.get("/uri").sessionAttrs(sessionAttrs))
.andDo(print())
.andExpect(MockMvcResultMatchers.status().isOk());
旧答案:
这里有一个更简单的解决方案,可以在不使用支持类的情况下实现相同的结果,这是我的代码片段(我不知道这些方法在Biju Kunjummen回答时是否已经可用):
HttpSession session = mockMvc.perform(post("/login-process").param("j_username", "user1").param("j_password", "user1"))
.andExpect(status().is(HttpStatus.FOUND.value()))
.andExpect(redirectedUrl("/"))
.andReturn()
.getRequest()
.getSession();
Assert.assertNotNull(session);
mockMvc.perform(get("/").session((MockHttpSession)session).locale(Locale.ENGLISH))
.andDo(print())
.andExpect(status().isOk())
.andExpect(view().name("logged_in"));
这与预期的一样工作,并且能够列出集成测试的覆盖率。 我们有一个SonarQube服务器运行在版本上,有人知道当使用代理时,该版本的SonarQube是否能够显示集成测试覆盖率吗?
translated_page: https://github.com/PX4/Devguide/blob/master/en/test_and_ci/continous_integration.md translated_sha: 95b39d747851dd01c1fe5d36b24e59ec865e323e PX4 Continuous Integration PX4 builds and
translated_page: https://github.com/PX4/Devguide/blob/master/en/test_and_ci/jenkins_ci.md translated_sha: 95b39d747851dd01c1fe5d36b24e59ec865e323e Jenkins CI Jenkins continuous integration server on S
translated_page: https://github.com/PX4/Devguide/blob/master/en/test_and_ci/README.md translated_sha: 95b39d747851dd01c1fe5d36b24e59ec865e323e 测试与持续集成 PX4提供大量的测试和持续集成。 本页提供概述。 在本地机器上测试 下面这条命令足够打开一个带有运
我使用Spring Integration的SFTP和出站通道适配器将文件上传到远程位置。当它将文件发送到一个SFTP位置时,它可以正常工作。然而,在我的代码中,我试图基于不同的标准发送到多个SFTP位置。 以下是我的设置-从Spring集成文件以下 我的问题是: 有人知道如何配置多个SFTP会话吗 谢谢