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


 

posted @ 2019-12-13 10:15  沧海一滴  阅读(2985)  评论(0编辑  收藏  举报