Java_UT_Mock系列之-11Mockito與異步方法01

測試場景

在最近的測試中,涉及到了異步方法的單元測試。百度了一下之后铛只,基本上的案例都來自于這里:

https://fernandocejas.com/2014/04/08/unit-testing-asynchronous-methods-with-mockito/

對比之后,發(fā)覺和我們的場景略微有些差異。我們的場景是:
某個client是一個通信客戶端捷绑, 而在client內(nèi)部維護了一個Connector類的實例來真正地完成Socket層面的send/recv等消息的發(fā)送和接收的工作。另外氢妈,有一個IListener接口來處理收到的消息粹污,當(dāng)Connector收到消息時,將調(diào)用IListener的onMessage方法來處理消息首量。 這樣就完成了消息的異步處理壮吩。
被測的方法 client.login()的處理邏輯是:
1)通過connector.login來發(fā)送消息。
2)監(jiān)控client.getConnected()的狀態(tài)加缘,檢查是否登陸成功鸭叙。
當(dāng)?shù)讓樱ㄍㄐ艑樱┦盏较r,會通過connector.onMessage(data)來進行處理拣宏,即通知IListener沈贝,進而將登陸狀態(tài)設(shè)置為登陸成功。
因此勋乾,在測試過程中宋下,我們只需要Mock Connector嗡善,并在connector.login被調(diào)用時,通過answer 來調(diào)用
connector.onMessage(data)学歧,模擬來自對端的消息罩引。

測試代碼

具體的代碼如下:
1 測試用例

import org.junit.Assert;import org.junit.Before;import org.junit.Test;import org.mockito.ArgumentCaptor;import org.mockito.Captor;import org.mockito.MockitoAnnotations;import org.mockito.Spy;import static org.mockito.Mockito.*;import org.mockito.invocation.InvocationOnMock;import org.mockito.stubbing.Answer;import demo.org.powermock.async.Client;import demo.org.powermock.async.Connector;import demo.org.powermock.async.IListener;
public class TestClient { 
String data="SUCCESS";
@Spyprivate Connector connector; 
 @Before public void initMocks() { 
MockitoAnnotations.initMocks(this); }
@Testpublic void TestClientLogin() {
Client client=new Client(connector,"localhost"); 
Answeranswer = new Answer() {
    @Override
public Object answer(InvocationOnMock invocation) throws Throwable {
    connector.onMessage(data);
    return null;
}
    };
doAnswer(answer).when(connector).login("localhost");
client.login();
Assert.assertTrue(client.getConnected());
}

}

2 被mock的底層通信類

public class Connector {
private IListener listener;
public void onMessage(String data) {
listener.onMessage(data);
}
public void setListener(IListener listener) {
this.listener=listener;
}
public void login(String url) {
System.out.println("sending login request to "+url);
}
}

3 回調(diào)具體類

public class Listener implements IListener {
private Client client;
public Listener(Client client) {
this.client=client;
}
@Override
public void onMessage(String data) {
System.out.println(data);
if(data.contains("SUCCESS")) {
client.setConnected(true);
}
};
}

4 回調(diào)接口

public interface IListener {
public void onMessage(String data);
}

5 被測類

public class Client {
private Connector connector;
private String server;
boolean connected=false;
public Client(Connector connector,String server) {
this.connector=connector;
this.server=server;
this.connector.setListener(new Listener(this));
}
public void setConnected(boolean connected) {
this.connected=connected;
}
public boolean getConnected() {
return connected;
}
public void login() {
int times=0;
// sending login request to remote
connector.login(server);
// waiting for response from network
while(!getConnected() && times <10) {
try {
Thread.sleep(100);
times++;
} catch (InterruptedException e) {
e.printStackTrace();
}}}}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市枝笨,隨后出現(xiàn)的幾起案子袁铐,更是在濱河造成了極大的恐慌,老刑警劉巖横浑,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昭躺,死亡現(xiàn)場離奇詭異,居然都是意外死亡伪嫁,警方通過查閱死者的電腦和手機领炫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來张咳,“玉大人帝洪,你說我怎么就攤上這事〗呕” “怎么了葱峡?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長龙助。 經(jīng)常有香客問我砰奕,道長,這世上最難降的妖魔是什么提鸟? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任军援,我火速辦了婚禮,結(jié)果婚禮上称勋,老公的妹妹穿的比我還像新娘胸哥。我一直安慰自己,他們只是感情好赡鲜,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布空厌。 她就那樣靜靜地躺著,像睡著了一般银酬。 火紅的嫁衣襯著肌膚如雪嘲更。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天揩瞪,我揣著相機與錄音赋朦,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛北发,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播喷屋,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼琳拨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了屯曹?” 一聲冷哼從身側(cè)響起狱庇,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎恶耽,沒想到半個月后密任,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡偷俭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年浪讳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涌萤。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡淹遵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出负溪,到底是詐尸還是另有隱情透揣,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布川抡,位于F島的核電站辐真,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏崖堤。R本人自食惡果不足惜侍咱,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望密幔。 院中可真熱鬧放坏,春花似錦、人聲如沸老玛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜡豹。三九已至麸粮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間镜廉,已是汗流浹背弄诲。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人齐遵。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓寂玲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親梗摇。 傳聞我的和親對象是個殘疾皇子拓哟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容