Spring Mvc controller單元測試
阿新 • • 發佈:2019-01-25
弄了一下午的controller測試類,(主要還是不理解)~~~~~
現在把我測試通過的步驟儲存下來,為需要的人一份借鑑
SpringMVC controller測試較簡單,從功能角度劃分,可分為兩種。一種是呼叫請求路徑測試,另一種是直接呼叫Controller方法測試。(我這是屬於前者)
註解:
- RunWith(SpringJUnit4ClassRunner.class): 表示使用Spring Test元件進行單元測試;
- WebAppConfiguration: 使用這個Annotate會在跑單元測試的時候真實的啟一個web服務,然後開始呼叫Controller的Rest API,待單元測試跑完之後再將web服務停掉;
- ContextConfiguration: 指定Bean的配置檔案資訊,可以有多種方式,這個例子使用的是檔案路徑形式,如果有多個配置檔案,可以將括號中的資訊配置為一個字串陣列來表示;
1、首先開發一個基類,用於載入配置檔案。以下所有的測試實現類都要繼承這個類
package com.xx.xx.common;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.transaction.annotation.Transactional;
/**
* Created by xx on 2017/11/13.
*/
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations= {"classpath:spring-mvc.xml","classpath:spring-context.xml"})
@ TransactionConfiguration(defaultRollback = true)
@Transactional(rollbackFor = Exception.class)
public class TestBase {}
2、接下來的測試的類TbsysUserControllerTest一定要繼承上面的基類
package com.xx.xx.controller;
import com.xx.xx.api.TbsysUserController;
import com.xx.xx.common.TestBase;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
/**
* Created by xieyuzhi on 2017/11/30.
*/
public class TbsysUsercControllerTest extends TestBase {
@Autowired
TbsysUserController tbsysUserController;
/**
* MockMvc是SpringMVC提供的Controller測試類,每次進行單元測試時,都是預先執行@Before中的setup方法,初始tbsysUserController單元測試環境。
MockMvc實現了對Http請求的模擬,能夠直接使用網路的形式,轉換到Controller的呼叫,
這樣可以使得測試速度快、不依賴網路環境,而且提供了一套驗證的工具,這樣可以使得請求的驗證統一而且很方便。 */
MockMvc mockMvc;
@Before
public void setup(){
/*** 注意:一定要把待測試的Controller例項進行*/
mockMvc= MockMvcBuilders.standaloneSetup(tbsysUserController).build();
}
@After
public void after() throws Exception {
}
//呼叫請求路徑
@Test
public void Ctest() throws Exception{
//第一種方法
ResultActions resultActions = this.mockMvc.perform(MockMvcRequestBuilders.post("/user/getdata").param("username", "xyz").param("pwd", "eHl6"));
MvcResult mvcResult = resultActions.andReturn();
//獲取狀態碼
System.out.println(mvcResult.getResponse().getStatus());
String result = mvcResult.getResponse().getContentAsString();
System.out.println("=====後臺程式碼返回的資料:" + result);
//第二種方法
// mockMvc.perform((post("/user/getdata")
// .param("username", "xyz").param("pwd", "eHl6")))
// .andExpect(status().isOk())
// .andDo(print());
}
}
3、展示一下我的被測試的controller
注意,如果這樣複製到你的程式碼裡面執行會報錯:
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- <version>1.7.5</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- <version>1.2.14</version>
- <scope>provided</scope>
-
</dependency>
我採用的是Spring Mvc 所以上面的兩個jar包都採用pom.xml的形式進行新增
2、可能會報錯為空指標的問題
java.lang.NullPointerException 空指標異常問題
我的按照這個走的就是總是報錯tbsysUserController為null;
在網上搜了好多網頁,廢了好長時間,發現是我的對映路徑錯了;
1、可能是選擇的是post方法,結果在controller的@RequestMapping裡面講獲取的方式寫成了get,我就把它兩種方式都寫上了,看截圖示的3的地方
2、我截的圖畫了三個框,1和2代表類和方法的對映路徑,這個必須要寫,我一開始只寫了方法的路徑/getdata,結果還是報空指標的錯,然後我就把類的對映路徑也加上了
總結:網上關於這類的部落格有很多,就是在一些小細節方面可能自己剛入門還不是很懂,所以就理解的不是很到位,很多東西需要自己多撞撞牆就知道了,相信有很多和我一樣的人