本文來源:http://www.reibang.com/p/13408dd4bef7
主要思路是:使用MockMvc發(fā)起請求仔掸,然后執(zhí)行相應(yīng)的代碼拂苹,在執(zhí)行的過程中使用Mockito的mock模擬底層數(shù)據(jù)的返回鹃答,最后結(jié)果驗(yàn)證底靠。
MockMvc相關(guān)官方地址官方指南鳖眼,文檔地址
1黑毅、首先需要增加相應(yīng)的依賴:
/pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
需要在測試類中增加如下注解:
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class MockXXXTest {
}
注解的大概使用是(想知道詳細(xì)的可自行去網(wǎng)上找一下):
@RunWith(SpringRunner.class),就是指用SpringRunner來運(yùn)行钦讳,其中
SpringJUnit4ClassRunner 和 SpringRunner 區(qū)別是什么矿瘦?
在官方文檔中有如下這句話:
SpringRunner is an alias for the SpringJUnit4ClassRunner
@SpringBootTest是SpringBoot的一個(gè)用于測試的注解,通過SpringApplication在測試中創(chuàng)建ApplicationContext愿卒。
@AutoConfigureMockMvc是用于自動配置MockMvc
2缚去、接著需要使用@MockBean模擬相應(yīng)對象
這里的主要作用是:使用mock對象代替原來spring的bean,然后模擬底層數(shù)據(jù)的返回琼开,而不是調(diào)用原本真正的實(shí)現(xiàn)易结。
注:與@MockBean 對應(yīng)的還有@SpyBean(有興趣可以去找一下相關(guān)的內(nèi)容)。 @SpyBean與 @Spy 的關(guān)系類似于 @MockBean 與 @Mock 的關(guān)系。和 @MockBean 不同的是搞动,它不會生成一個(gè) Bean 的替代品裝配到類中躏精,而是會監(jiān)聽一個(gè)真正的 Bean 中某些特定的方法,并在調(diào)用這些方法時(shí)給出指定的反饋鹦肿。
- 首先增加
@MockBean
注解
public class MockXXXTest {
@MockBean
private XXXDao xxxtDao;
}
SpringBoot 中, @MockBean 會將mock的bean替換掉 SpringBoot 管理的原生bean矗烛,從而達(dá)到mock的效果。
mock:在軟件開發(fā)的世界之外, "mock"一詞是指模仿或者效仿. 因此可以將“mock”理解為一個(gè)替身箩溃,替代者. 在軟件開發(fā)中提及"mock"瞭吃,通常理解為模擬對象或者Fake
- 然后 Stub 打樁
Mockito.when(
xxxDao.findMapBySql(
Mockito.anyString(),Mockito.anyList()
)
).thenReturn(dataList);
這里的when(…).thenReturn(…)
表示的是:當(dāng)定義(when)對象、方法和參數(shù)(輸入)涣旨,然后(thenReturn) 中返回結(jié)果(輸出)歪架。默認(rèn)情況下,所有的函數(shù)都有返回值开泽。mock函數(shù)默認(rèn)返回的是null牡拇,一個(gè)空的集合或者一個(gè)被對象類型包裝的內(nèi)置類型,例如:0穆律、false對應(yīng)的對象類型為Integer、Boolean导俘。
這里值得注意的是:方法中使用的參數(shù)可以使用參數(shù)匹配器峦耘,如:Mockito.anyString(),Mockito.anyList()
,當(dāng)其中有一個(gè)參數(shù)使用了參數(shù)匹配器旅薄,其實(shí)的所有參數(shù)也需要使用參數(shù)匹配器辅髓,否則會出現(xiàn)異常。
3 使用MockMvc發(fā)送請求
這里的主要作用是:使用MockMvc發(fā)起一個(gè)請求少梁,然后進(jìn)行驗(yàn)證規(guī)則洛口、進(jìn)一步處理返回結(jié)果等。
//配置MockMvc
@Autowired
protected MockMvc mockMvc;
@Test
public void TestXXX() throws Exception {
MvcResult result = mockMvc.perform(
MockMvcRequestBuilders.get("/xxxController/xxx_query")
.contentType(MediaType.APPLICATION_JSON_UTF8)
.param("xxx","xxx")
)
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn();
}
}
.perform()
執(zhí)行一個(gè)MockMvcRequestBuilders請求凯沪。其中.get()
表示發(fā)送get請求(可以使用get第焰、post、put妨马、delete等)挺举;.contentType()
設(shè)置編碼格式;.param()
請求參數(shù),可以帶多個(gè)烘跺。
andExpect()
添加 MockMvcResultMatchers驗(yàn)證規(guī)則湘纵,驗(yàn)證執(zhí)行結(jié)果是否正確。
.andDo()
添加 MockMvcResultHandlers結(jié)果處理器,這是可以用于打印結(jié)果輸出滤淳。
.andReturn()
結(jié)果還回梧喷,然后可以進(jìn)行下一步的處理。
完整例子如下:
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class MockXXXTest {
@Autowired
protected MockMvc mockMvc;
@MockBean
private XXXDao xxxtDao;
@Test
public void TestXXX() throws Exception {
List<Map<String,Object>> dataList= new ArrayList<>();
Map m=new HashMap();
m.put("name","test");
dataList.add(m);
Mockito.when(xxxDao.findMapBySql(Mockito.anyString(),Mockito.anyList())).thenReturn(dataList);
Mockito.when(xxxDao.findTotalCountBySql(Mockito.anyString(),Mockito.any())).thenReturn((long)1);
MvcResult result = mockMvc.perform(
MockMvcRequestBuilders.get("/xxxController/xxx_query")
.contentType(MediaType.APPLICATION_JSON_UTF8)
.param("xxx","xxx")
)
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn();
System.out.println(result);
}
}
作者:https迷路了
鏈接:http://www.reibang.com/p/13408dd4bef7
來源:簡書
簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處铺敌。