java如何模拟请求_单元测试如何模拟用户请求
python web自動(dòng)化測(cè)試設(shè)計(jì)構(gòu)工具書(shū)
40.9元
包郵
(需用券)
去購(gòu)買(mǎi) >
錯(cuò)誤
正當(dāng)我高高興興寫(xiě)完后臺(tái)c層的測(cè)試代碼準(zhǔn)備提交時(shí),測(cè)試機(jī)器人報(bào)了很多401錯(cuò)誤,把代碼拉下來(lái)一看,原來(lái)當(dāng)我寫(xiě)代碼時(shí),我的伙伴已經(jīng)寫(xiě)好后臺(tái)的攔截器了,只有綁定了token的用戶(hù)才能訪問(wèn)后臺(tái),所以當(dāng)我單元測(cè)試c層模擬請(qǐng)求時(shí)就會(huì)報(bào)錯(cuò),
因?yàn)槲业哪M前臺(tái)請(qǐng)求就像是一個(gè)沒(méi)有登陸的用戶(hù)請(qǐng)求,經(jīng)過(guò)攔截器必然是被攔截了下來(lái)。
解決經(jīng)過(guò)
一開(kāi)始有點(diǎn)不知所錯(cuò)。我們的模擬請(qǐng)求失敗是因?yàn)楹笈_(tái)在沒(méi)有綁定token的情況下請(qǐng)求了其他接口,而我們的攔截器也沒(méi)有發(fā)token給模擬請(qǐng)求。我們正常要使用系統(tǒng)的話要先登錄,第一次登錄的話后臺(tái)會(huì)發(fā)送一個(gè)token給前臺(tái)并與用戶(hù)綁定,以后就會(huì)帶著后臺(tái)發(fā)來(lái)的token去請(qǐng)求。
所以首先模擬一下正常的登錄流程。創(chuàng)造一個(gè)方法loginUser(),在方法上添加注釋@Before,用于在每個(gè)測(cè)試方法前執(zhí)行。在這個(gè)先新建一個(gè)用戶(hù)用來(lái)當(dāng)我們的模擬用戶(hù),我們用這個(gè)用戶(hù)的username和password來(lái)進(jìn)行登錄,然后在進(jìn)行請(qǐng)求。
@Test
public void loginUser() throws Exception
{
String url = "/user/login";
String username = RandomString.make(6);
String password = RandomString.make(6);
JSONObject jsonObject = new JSONObject();
jsonObject.put("username", username);
jsonObject.put("password", password);
// 當(dāng)以參數(shù)username, password調(diào)用userService.login方法時(shí),返回true
Mockito.when(this.userService.login(username, password)).thenReturn(true);
// 觸發(fā)C層并斷言返回值
this.mockMvc.perform(MockMvcRequestBuilders.post(url)
.contentType(MediaType.APPLICATION_JSON_UTF8)
.content(jsonObject.toJSONString()))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().string("true"));
}
但是兩次模擬請(qǐng)求并不是同一個(gè)用戶(hù),我們需要在第一次請(qǐng)求的時(shí)候獲取token并保存用戶(hù),在后續(xù)請(qǐng)求攜帶token發(fā)出模擬請(qǐng)求。這就需要引入request類(lèi)。
上述方法太麻煩了,在學(xué)長(zhǎng)的建議下,研究攔截器原理,發(fā)現(xiàn)攔截器通過(guò)isLogin()函數(shù)里判斷token來(lái)判斷這個(gè)用戶(hù)是否登陸過(guò),如果把isLogin方法mock一下,讓他永遠(yuǎn)返回true就無(wú)論傳什么token就都可以不被攔截了。
@Before
public void loginUser() throws Exception {
Mockito.when(this.userService.isLogin(Mockito.any(String.class))).thenReturn(true);
}
但是只是在mock方法里規(guī)定傳入string類(lèi)型是不行的,我們模擬請(qǐng)求默認(rèn)token是null,所以我們應(yīng)該在模擬請(qǐng)求時(shí)加入header的token信息,隨意一個(gè)字符串就好。
this.mockMvc.perform(
MockMvcRequestBuilders.get(url)
.header("auth-token", "key")
.param("page", "1")
.param("size", "2"))
.andExpect(MockMvcResultMatchers.status().isOk());
我們也可以在mock方法里設(shè)置傳入任一參數(shù)都返回true,這樣我們就不用在后續(xù)模擬請(qǐng)求中發(fā)送token了。
@Before
public void loginUser() throws Exception {
Mockito.when(this.userService.isLogin(Mockito.any())).thenReturn(true);
}
總結(jié)
不斷改進(jìn)自己的解決辦法,從中學(xué)到更多解決問(wèn)題的方法,同時(shí)加深了對(duì)攔截器和token的了解。
java 11官方入門(mén)(第8版)教材
79.84元
包郵
(需用券)
去購(gòu)買(mǎi) >
總結(jié)
以上是生活随笔為你收集整理的java如何模拟请求_单元测试如何模拟用户请求的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java调用kafka接口发送数据_Ja
- 下一篇: java enum 报错_enum报错问