1. 程式人生 > >Spring Mvc controller單元測試

Spring Mvc controller單元測試


 弄了一下午的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

注意,如果這樣複製到你的程式碼裡面執行會報錯:

  1. <dependency>  
  2.       <groupId>org.slf4j</groupId>  
  3.       <artifactId>slf4j-log4j12</artifactId>  
  4.       <version>1.7.5</version>  
  5.       <scope>provided</scope>  
  6.     </dependency>  
  7.     <dependency>  
  8.       <groupId>log4j</groupId>  
  9.       <artifactId>log4j</artifactId>  
  10.       <version>1.2.14</version>  
  11.       <scope>provided</scope>  
  12.     </dependency> 

我採用的是Spring Mvc 所以上面的兩個jar包都採用pom.xml的形式進行新增

2、可能會報錯為空指標的問題

java.lang.NullPointerException 空指標異常問題

我的按照這個走的就是總是報錯tbsysUserController為null;

在網上搜了好多網頁,廢了好長時間,發現是我的對映路徑錯了;

1、可能是選擇的是post方法,結果在controller的@RequestMapping裡面講獲取的方式寫成了get,我就把它兩種方式都寫上了,看截圖示的3的地方

2、我截的圖畫了三個框,1和2代表類和方法的對映路徑,這個必須要寫,我一開始只寫了方法的路徑/getdata,結果還是報空指標的錯,然後我就把類的對映路徑也加上了

總結:網上關於這類的部落格有很多,就是在一些小細節方面可能自己剛入門還不是很懂,所以就理解的不是很到位,很多東西需要自己多撞撞牆就知道了,相信有很多和我一樣的人

借鑑連結:http://blog.csdn.net/u013041642/article/details/71430293