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


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM