SpringBootTest MockMVC绑定session(需要登陆的接口)
https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#testing
spring-test+JUnit实现springMVC测试用例
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.0.6.RELEASE</version> </dependency>
创建spring-test的基类,该类主要用来加载配置文件,设置web环境的,然后所有的测试类继承该类即可,基类BaseTest类代码如下:
import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:spring.xml","classpath:spring-mybatis.xml"}) @WebAppConfiguration("src/main/webapp") public class BaseTest { }
@RunWith(SpringJUnit4ClassRunner.class) 使用junit4进行测试
@ContextConfiguration() 加载spring相关的配置文件
@WebAppConfiguration() 设置web项目的环境,如果是Web项目,必须配置该属性,否则无法获取 web 容器相关的信息(request、context 等信息)
https://blog.csdn.net/xingkongdeasi/article/details/79963827
再用 MockMvc 写 web 项目 controller 层的测试用例的时候,碰到登录的问题。
背景: 项目是ssm 架构,权限是用的 keycloak。 在使用 MockMvc 写测试用例,发送http 请求的时候,服务器需要验证用户信息。最开始使用过 header(HttpHeaders.AUTHORIZATION,basicDigestHeaderValue)
和 with(httpBasic(“username”,”password”) 方式在请求中添加 验证信息,但是都是不行,系统报空指针异常,最后发现 spring 有个 WithMockUser 注解可以使用,最后给方法加上 @WithMockUser 注解 成功解决了 登录的问题。
https://blog.csdn.net/sessionsong/article/details/81104906
操作很简单,只需要一个对象:MockHttpSession。
在每次构建请求的时候把session附加进去就行了,下面是示例代码
@RunWith(SpringRunner.class) @SpringBootTest @Slf4j public class BlackCompanyWebApiTests { @Autowired private WebApplicationContext wac; private MockMvc mockMvc; private MockHttpSession session;// 1.定义一个变量保存session @Before public void setUp() throws Exception { mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); session = new MockHttpSession(); //2.初始化 } @Test public void test() throws Exception { // 登陆 MockHttpServletRequestBuilder loginRequestBuilder = MockMvcRequestBuilders.post("/auth/login") .param("username", "test") .param("password", "123456") .contentType(MediaType.APPLICATION_JSON_UTF8) .accept(MediaType.APPLICATION_JSON) .session(session);//3.当某个请求需要session时,直接在构造器中绑定需要的session mockMvc.perform(loginRequestBuilder) //.andExpect(jsonPath("$.code").value("200"))//登陆成功 ; // 其他操作 MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.get("/other-api") .contentType(MediaType.APPLICATION_JSON_UTF8) .accept(MediaType.APPLICATION_JSON) .session(session);// 4.需要时,绑定session mockMvc.perform(requestBuilder) .andDo(result -> { System.out.println(result.getResponse().getContentAsString()); }) } }
原文链接:https://blog.csdn.net/qq_29753285/article/details/93468852