概述
對模塊進行集成測試時题造,希望能夠通過輸入URL對Controller進行測試,如果通過啟動服務(wù)器将鸵,建立http client進行測試勉盅,這樣會使得測試變得很麻煩,比如顶掉,啟動速度慢草娜,測試驗證不方便,依賴網(wǎng)絡(luò)環(huán)境等痒筒,這樣會導(dǎo)致測試無法進行宰闰,為了可以對Controller進行測試,可以通過引入MockMVC進行解決簿透。
簡介
MockMvc實現(xiàn)了對Http請求的模擬移袍,能夠直接使用網(wǎng)絡(luò)的形式,轉(zhuǎn)換到Controller的調(diào)用老充,這樣可以使得測試速度快葡盗、不依賴網(wǎng)絡(luò)環(huán)境,而且提供了一套驗證的工具啡浊,這樣可以使得請求的驗證統(tǒng)一而且很方便觅够。
運行配置
用到的注解
- RunWith(SpringJUnit4ClassRunner.class): 表示使用Spring Test組件進行單元測試;
- WebAppConfiguration: 使用這個Annotate會在跑單元測試的時候真實的啟一個web服務(wù),然后開始調(diào)用Controller的Rest API巷嚣,待單元測試跑完之后再將web服務(wù)停掉;
- ContextConfiguration: 指定Bean的配置文件信息喘先,可以有多種方式,這個例子使用的是文件路徑形式廷粒,如果有多個配置文件苹祟,可以將括號中的信息配置為一個字符串?dāng)?shù)組來表示;
基本框架
/**
* 演示MockMVC使用
* @author zhanyongzhi
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath*:**web-config.xml")
@WebAppConfiguration
public class MockMvcTest {
private MockMvc mockMvc;
@Autowired
private WebApplicationContext webApplicationContext;
@Before
public void setUp() throws Exception {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
}
測試邏輯
校驗Controller處理之后,請求是否為成功狀態(tài)评雌,返回的內(nèi)容是否包含了:"{'foo':'bar'}"字符串树枫。
- mockMvc調(diào)用perform,調(diào)用controller的業(yè)務(wù)處理邏輯
- perform返回ResultActions景东,返回操作結(jié)果砂轻,通過ResultActions,提供了統(tǒng)一的驗證方式斤吐。
- 使用StatusResultMatchers對請求結(jié)果進行驗證
- 使用ContentResultMatchers對請求返回的內(nèi)容進行驗證
/**
* 演示MockMVC使用
* @author zhanyongzhi
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath*:**web-config.xml")
@WebAppConfiguration
public class MockMvcTest {
private MockMvc mockMvc;
@Autowired
private WebApplicationContext webApplicationContext;
@Before
public void setUp() throws Exception {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
@Test
public void demo() throws Exception {
mockMvc.perform(get("/demo/test").accept(MediaType.parseMediaType("application/json;charset=UTF-8")))
.andExpect(status().isOk())
.andExpect(content().contentType("application/json;charset=UTF-8"))
.andExpect(content().json("{'foo':'bar'}"));
}
}