iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 22
1
Modern Web

30天學習Spring MVC系列 第 22

Day 22 Spring Boot 單元測試(Unit Test)-MockMvc框架介紹

  • 分享至 

  • xImage
  •  

前言

我的Spring Boot為2.0.0.BUILD-SNAPSHOT,網路上相關的資料大多是1.5的版本,在配置上有些的@宣告可能會稍微有點不太一樣,那這篇是要來介紹相關的配置載入要如何撰寫

程式說明

1.測試類的宣告

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Tutorial2Application.class)
@WebAppConfiguration

1.RunWith : 要用org.springframework.test.context.junit4.SpringJUnit4ClassRunner的類來做為運行我們的類
2.SpringBootTest(classes = ? ) : ?後為你的main class的主類名稱
3.WebAppConfiguration : WebAppConfiguration如果你要使用Web的環境來做測試模擬這是要加上去的,1.5的版本會是

ex:

@RunWith(SpringJUnit4ClassRunner.class)  
@SpringBootTest(classes = Application.class)  
...省略

@Autowired  
    private WebApplicationContext webApplicationContext; 

而我的是:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Tutorial2Application.class)
@WebAppConfiguration
...省略
@Autowired
    private WebApplicationContext webApplicationContext;

只差在說我們要設定@WebAppConfiguration否則他無法去做Web的環境測試
接下來我們要創建一個 MockMvc類別物件,你可以在@WebAppConfiguration下加上@Transactional註解,當每次執行完測試會再將數據roll back!!

MockMvc mvc; //創建MockMvc類的物件

我們還沒有對mvc做初始化直接使用會發生錯誤,利用@Befor在做測試之前,會先執行@Before內宣告的方法,我們寫了一個初始化設定的方法,MockMvc mvc去做了webApplicationContext的初始化建立

@Before
	public void setup(){
		mvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
	}

測試程式主要入口

這個入口跟我們的Java application的入口main函式是一樣的概念,這個要做的主要方法,只是我們可以先對這個類做@Before內的宣告方式初始化

@Test
	public void contextLoads() throws Exception {
		String uri = "/memberApi/1";
		MvcResult result = mvc.perform(MockMvcRequestBuilders.get(uri).accept(MediaType.APPLICATION_JSON)).andReturn();
		int status = result.getResponse().getStatus();
		System.out.println(status);
		Assert.assertEquals("錯誤",200,status);
	}

throws Exception :如果加上try catch錯誤訊息就會消失了,發生例外做throws例外

uri : 我設定一個字串去存取我要測試的REST入口方法,這邊以Get方法做測試

perform(request):此方法為要做一個請求的建立,這是一個模擬請求的方式

get(url) : 要去request(請求)的連結

accept: 接受何種格式回傳 我用MediaType.APPLICATION_JSON 接受以JSON格式回傳

andReturn方法 :將結果轉換成MockMvc的型態

status : 回傳狀態的變數

MvcResult getResponse().getStatus() : 取回回傳狀態

Assert(斷言測試)

assertEquals("string",200(statusCode),status)

第一個參數:當發生錯誤時要產生的提示文字

第二個參數: 當返回值非第二個參數的數值時觸發

第三個參數: 返回參數

我的目錄架構配置

主類:

└── src
    └── main
        └── java
            └── com.tutorial
                └──com.tutorial.Controller
                    └──MemberApiController.java
                └──com.tutorial.Model
                    └──Memberaccount.java
                └──com.tutorial.Dao
                    └──MemberApiRepository.java
                    

模擬一個POST

package com.example.demo;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
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.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.tutorial.Tutorial2Application;
import com.tutorial.Dao.MemberApiRepository;
import com.tutorial.Model.Memberaccount;	




@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Tutorial2Application.class)
@WebAppConfiguration
public class Tutorial2ApplicationTests {
	@Autowired
	private MemberApiRepository memberApiRepository; //加入MemberRepository
	@Autowired
    private WebApplicationContext webApplicationContext;
	
	@Autowired
	ObjectMapper objectMapper;
	MockMvc mvc; //創建MockMvc類的物件
	
	Memberaccount memberaccount ;
	@Before
	public void setup(){
		memberaccount = new Memberaccount();
		memberaccount.setCellphone("02135121");
		memberaccount.setEmail("qewq@qwe.asd.s");
		memberaccount.setPassword("qweqqq");
		mvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
		

	}
	
	
	
	@Test
	public void contextLoads() throws Exception {
		String uri = "/memberApi/1";
	
		try{

			MvcResult result = mvc.perform(MockMvcRequestBuilders.post(uri).content(objectMapper.writeValueAsString(memberaccount)).accept(MediaType.APPLICATION_JSON)).andReturn();
			int status = result.getResponse().getStatus();
			Assert.assertEquals("錯誤",200,status);
		}
		catch(Exception ex){
			ex.printStackTrace();
		}
	}

}

重點與心得

1.要將物件轉成JSON可以@Autowired ObjectMapper ,利用ObjectMapper來做轉換
2.MockMvcRequestBuilders.(get,post,put,delete)要記住我們的@RestController設定的Method只接受何種請求,不然你會一直失敗

參考資源

1.(http://blog.csdn.net/congge_1993/article/details/78541182 )


上一篇
Day 21 Spring Boot 單元測試(Unit Test)
下一篇
Day23 Spring MVC例外處理篇(Exception Handling in Spring MVC)[上]
系列文
30天學習Spring MVC30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言