日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java如何模拟请求_单元测试如何模拟用户请求

發(fā)布時(shí)間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java如何模拟请求_单元测试如何模拟用户请求 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。