zoukankan      html  css  js  c++  java
  • 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


  • 相关阅读:
    《数据通信与网络》笔记--数据链路层的成帧
    设计模式10---设计模式之原型模式(Prototype)
    Yii 控制dropdownlist / select 控件的宽度和 option 的宽度
    [置顶] 如何vs在cocos2dx项目中打印中文
    mongodb实现简单的增删改查
    北京和硅谷在创新方面的区别
    Android 解决Gallery下ScrollView滑动事件冲突
    Java 授权内幕--转载
    JAVA 上加密算法的实现用例---转载
    基于事件的 NIO 多线程服务器--转载
  • 原文地址:https://www.cnblogs.com/softidea/p/12033652.html
Copyright © 2011-2022 走看看