1. 程式人生 > >Spring-Controller單元測試

Spring-Controller單元測試

一般測試驅動開發專案中,我們會在Maven中建立一個專案檔案和一個一一對應的測試專案檔案。每寫好一個模組,先對其進行單元測試,再整合到現有的系統中。

針對Controller、Service、Dao三層架構來說,我們最常對Service和Dao進行單元測試。然而Controller的測試,很多人還是啟動Tomcat,進行介面測試,這樣不緊需要等待很長的編譯部署時間而且無法逐個Controller功能進行單獨測試,因此特意總結Controller層的單元測試。

技術選型:SpringMVC框架 。SpringMVC已經繼承了單元測試的類

1.建立普通類檔案

2.引入Spring單元測試註釋

@RunWith(SpringJUnit4ClassRunner.class)  //此處呼叫Spring單元測試類
@WebAppConfiguration	//呼叫javaWEB的元件,比如自動注入ServletContext Bean等等
@ContextConfiguration(locations = {"classpath:spring-context.xml","classpath:spring-mvc.xml"})//載入Spring配置檔案
public class HealthArticleControllerTest {...程式碼片段 }//測試程式碼類
注意:

@WebAppConfiguration如果不加的話,是沒法呼叫WEB的一些特性的。經常會被遺忘掉。。。

@ContextConfiguration中,需要把所有Spring的配置檔案全部載入進來,因為有的專案中Spring 的xml配置是分拆的。 此處的xml是放在resources的根目錄中。

3.引入spring註解後,Controller的單元測試需要模擬Server的執行,需要在class中進行WEB環境的初始化。

    @Autowired
    HealthArticleController healthArticleController;

    @Autowired
    ServletContext context;

    MockMvc mockMvc;
    @Before
    public void setup(){
        mockMvc = MockMvcBuilders.standaloneSetup(healthArticleController).build();
    }
HealthArticleController是我需要測試的Controller

MockMvc是SpringMVC提供的Controller測試類

每次進行單元測試時,都是預先執行@Before中的setup方法,初始化healthArticleController單元測試環境。

注意:一定要把待測試的Controller例項進行MockMvcBuilders.standaloneSetup(xxxxController).build(); 否則會丟擲無法找到@RequestMapping路徑的異常:No mapping found for HTTP request with URI [/cms/app/getArticleList] in DispatcherServlet

4.前期準備工作都做好了。可以編寫單元測試方法了。

<span style="font-family: Arial, Helvetica, sans-serif;">
</span>
<span style="font-family: Arial, Helvetica, sans-serif;">@org.junit.Test
    public void getArticleListTest(){
</span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre">		</span>String postJson = healthArticleController.findPage();</span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre">		</span>//傳送請求</span>
        ResultActions resultActions = this.mockMvc.perform(MockMvcRequestBuilders.post("/cms/app/getArticleList").accept(MediaType.APPLICATION_JSON).param("criJson",postJson));
        MvcResult mvcResult = resultActions.andReturn();
        String result = mvcResult.getResponse().getContentAsString();
        System.out.println("=====客戶端獲得反饋資料:" + result);
}

ResultAction是用來模擬Browser傳送FORM表單請求的。post()是請求的地址,accept()請求的內容 param()請求的鍵值對,如果有多個引數可以後綴呼叫多個param()

MvcResult是獲得伺服器的Response內容。

5.到此,整個完整的Controller單元測試完成。貼上我完整的程式碼

package com.chinare.health.modules.cms;

import org.junit.Before;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
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;

import javax.servlet.ServletContext;
import java.util.Map;

/**
 * author: Samuel
 * Date:2015-07-04
 */

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = {"classpath:spring-context.xml", "classpath:spring-context-jedis.xml", "classpath:spring-mvc.xml", "classpath:spring-context-shiro.xml", "classpath:spring-context-activiti.xml"})
public class HealthArticleControllerTest {

    @Autowired
    HealthArticleController healthArticleController;

    @Autowired
    ServletContext context;

    MockMvc mockMvc;
    @Before
    public void setup(){
        mockMvc = MockMvcBuilders.standaloneSetup(context).build();
    }

    @org.junit.Test
    public void getArticleListTest() throws Exception{
        //準備引數
        String <span style="font-family: Arial, Helvetica, sans-serif;">postJson </span>= "{\"mac\":\"h\",\"dtClient\":\"2015-06-03 13:20:10\"}";
        
        //傳送請求
        ResultActions resultActions = this.mockMvc.perform(MockMvcRequestBuilders.post("/cms/app/getArticleList")
                .accept(MediaType.APPLICATION_JSON).param("criJson",postJson));
        MvcResult mvcResult = resultActions.andReturn();
        String result = mvcResult.getResponse().getContentAsString();
        System.out.println("=====客戶端獲得反饋資料:" + result);

        
    }



}




相關推薦

Spring-Controller單元測試

一般測試驅動開發專案中,我們會在Maven中建立一個專案檔案和一個一一對應的測試專案檔案。每寫好一個模組,先對其進行單元測試,再整合到現有的系統中。 針對Controller、Service、Dao三層架構來說,我們最常對Service和Dao進行單元測試。然而Contro

Spring Mvc controller單元測試

 弄了一下午的controller測試類,(主要還是不理解)~~~~~ 現在把我測試通過的步驟儲存下來,為需要的人一份借鑑 SpringMVC controller測試較簡單,從功能角度劃分,可分為兩種。一種是呼叫請求路徑測試,另一種是直接呼叫Controller方法測試

Spring MVC 單元測試異常 Caused by: org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file

read cti exe document ive pri simple fff ces Sping 3.2.8.RELEASE + sping mvc + JDK 1.8運行異常。 java.lang.IllegalStateException: Failed to

Spring-test單元測試

xtend manage 單元 true nconf ret trace ace oca package com.OnlineRetailers.service.base; import org.junit.runner.RunWith; import org.spri

spring boot 單元測試(附:單元測試斷言彙總)

Spring boot 單元測試: 常用的程式測試方法有: 1、直接通過在瀏覽器輸入網址訪問; 2、通過postman工具來測試; 3、通過編寫python指令碼來進行測試; 但這樣經常會一測就要測一整塊,相對單元測試來說定位問題比較麻煩,單元測試能幫助我們拆分方法,單獨測試

Spring Boot單元測試&網路請求

實際開發中,Junit單元測試是必不可少的。在spring-boot 中可以通過測試模組(spring-boot-starter-test)快速使用單元測試功能。 開始 本示例在 spring boot 1.5.4 版本測試通過 1、pom.xml中新增配置spring-b

spring boot單元測試之druid NullPointException

最近在使用spring boot 對 Controller 進行單元測試時,發現 druid 竟然丟擲了空指標異常。原因是,使用了druid的監控,需要經過druid的 Filter 攔截器,但是spr

Springboot---Controller單元測試

知識準備 1、註解含義 @RunWith(SpringRunner.class):表示使用Spring Test元件進行單元測試,其中SpringRunner繼承類SpringJUnit4ClassRunner。  @WebAppConfiguration:測試環境使用,

Maven專案中引入spring-test單元測試 @RunWith與@ContextConfigration報錯

場景 在SSM專案整合時引入spring-test單元測試時, @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={"classpath:applicationContext.xml"}) 報錯

spring boot 單元測試

引入maven依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-bo

spring Junit單元測試 bean 無法注入的問題

本人菜鳥在學習ssh 過程 ,遇見問題 向各位大佬請教。進行單元測試 爆出下面提示: 貼出下面配置資訊: applicationContext.xml 實現service 介面類 實現dao介面類 單元測試 進過本菜鳥的各種錯嘗試,上面的配置檔案內容沒有錯誤,只是整合框架的過

JUnit4結合spring單元測試

做單元測試非常簡單,結合spring做單元測試也很簡單。 首先,導包 先看一下目錄結構: 下面是測試基類(): package pms_test; import org.junit.Test; import org.junit.runner.RunWith; im

Spring Boot 單元測試,注入失敗,報空指標錯誤

我們在使用專案的時候,常常需求去單元測試,去測試我們寫的介面是否可以正常執行.自己在練習Spring Boot 搭建 Redis的時候進行測試.下面是測試類./** * @author jins * @date on 2018/5/6. */ @RunWith(Spri

Spring單元測試

   一、在已經通過逆向工程生成相應類、介面、mapper後,希望向類中注入屬性並新增自己的方法 (1)向類中注入屬性: private Department department;         向員工

Spring教程第二篇:Spring-Test(單元測試)

在Spring的框架下,做單元測試的兩種辦法: 一、使用spring中對Junit框架的整合功能 除了junit4和spring的jar包,還需要spring-test.jar。引入如下依賴: <dependency>

spring boot 單元測試錯誤

java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTes

Spring Boot 單元測試詳解+實戰教程

Spring Boot 的測試類庫 Spring Boot 提供了許多實用工具和註解來幫助測試應用程式,主要包括以下兩個模組。 spring-boot-test:支援測試的核心內容。 spring-boot-test-autoconfigure:支援測試的

Spring mvc單元測試

import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.spring

spring-test單元測試(二)-進行struts action的請求單元測試

單元測試雖不強求,但你一旦養成習慣,你會愛上它。另外我們保證程式碼質量的兩個很重要的手段,一個是頭(單元測試)一個是尾(codereview)。那麼我們最常用的單元測試就是通過junit來進行,spring-test框架很好的集成了junit來進行這項工作,比如測試dao,

spring mvc單元測試(帶請求引數)

package com.gpl.test; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springfr