1. Junit工作原理
使用JUnit測試,不用自己在測試類中寫很多main函數測試。
單元測試返回值都爲空(public void)。單元測試通過的標準(滿足下面其中一個條件即可):
a)測試方法運行完沒有拋出異常.
b)測試方法拋出的異常,和“expect”定義的異常一致
當滿足標準, Eclipse自動判斷測試通過。
2 Unit Test in SpringBoot
用如下註解修飾測試類
@RunWith(SpringRunner.class) //運行測試的類。 不寫這個的情況下,會//直接用JUnit去跑。 SpringRunner是JUnit的擴展
@SpringBootTest //可以加測試的參數,如端口
@AutoConfigureMockMvc // 測試RestAPI的時候會用到。 封裝了TestRestTemplate的相關功能
package com.github.binarywang.demo.wx.mp.controller;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class WxPortalControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testAuthGet() throws Exception {
this.mockMvc
.perform(get("/wx/portal/wx23bb34a1ff46582d")
.param("signature", "93d0ef82f9e01a94971d2fb4eb6aca61f29509aa").param("timestamp", "1558536215")
.param("nonce", "9874674366").param("echostr", "dfdkasjdfaskdjf"))
.andDo(print()).andExpect(status().isOk()).andExpect(content().string("dfdkasjdfaskdjf"));
;
}
}
2.1 測試Service層
2.2 測試Controller層
通過MockMvc類去觸發api
a)perfrom()的參數是要創建一個Request
通過MockMvcRequestBuilders 去創建,get()其實是MockMvcRequestBuilders.get().因爲import了這個類,所以可以簡寫
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
get()返回的是MockHttpServletRequestBuilder. MockHttpServletRequestBuilder.param())是爲了創建Request,所以它返回的依然是MockHttpServletRequestBuilder,所以,假如有多個參數,可以直接用多個param()方法引入
b)Perform()的返回值是ResultActions
ResultActions.andExcept()用於判斷運行結果,起到斷言的作用。 它的參數是MockMvcResultMatchers。通過
MockMvcResultMatchers.status()判斷返回值
MockMvcResultMatchers.content(),獲取response content的屬性/內容去比較
返回值爲string是
andExpect(content().string("dfdkasjdfaskdjf"))
返回值爲Json
andExpect(MockMvcResultMatchers.jsonPath("$.name").value("Mock測試2"))
比較返回值contenttype
.andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON_UTF8))
另外一種情況是通過ResultActions.andReturn(),返回一個MvcResult,用其他斷言去比較返回結果
參考文章
https://www.cnblogs.com/ysocean/p/6889906.html