Android中怎么測試異步任務(wù),很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
江孜網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,江孜網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為江孜1000多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個(gè)售后服務(wù)好的江孜做網(wǎng)站的公司定做!
Android中的測試(寬泛的定義)是一個(gè)單元測試集合的擴(kuò)展。涉及初始化、關(guān)閉測試,包含setUp()和tearDown()操作,使用反射 的方式推斷出不同的測試方式(從JUnit4開始我們就可以使用注釋來指定的優(yōu)先級和執(zhí)行所有測試)。一個(gè)典型的測試結(jié)構(gòu)如下:
public class MyManagerTest extends ActivityTestCase { public MyManagerTest(String name) { super(name); } protected void setUp() throws Exception { super.setUp(); } protected void tearDown() throws Exception { super.tearDown(); } public void testDummyTest() { fail("Failing test"); } }
這是一個(gè)非常明顯的示例:實(shí)際開發(fā)中,我們想要測試?yán)鏗TTP響應(yīng)、SQL存儲等等。在Sixt我們遵從一種Manager/Model方法:每 個(gè)Model包含一個(gè)實(shí)體(車、顧客等)的表現(xiàn)。每個(gè)Manager用不同的模型(例如,我們的LoginManager可能需要用戶與之交互的模型)聚 合成一套功能。
大多數(shù)的Manager集中執(zhí)行HTTP請求是要從后臺獲取數(shù)據(jù)。例如,我們用下面的代碼來執(zhí)行用戶的登錄:
mLoginManager.performLoginWithUsername("username", "password", new OnLoginListener() { @Override public void onFailure(Throwable throwable) { fail(); } Override public void onSuccess(User customer) { //.. } });
應(yīng)用到我們自己的測試集合后,當(dāng)?shù)玫筋A(yù)期之外的結(jié)果時(shí),只是讓這一結(jié)果失敗。我們可以看到為什么在onFailure()函數(shù)中我們調(diào)用了 fail()。接下來,即使我用一個(gè)錯(cuò)誤的用戶名也能通過這個(gè)測試。思前想后,測試似乎是按照代碼順序執(zhí)行的,但并沒有等到回調(diào)函數(shù)的結(jié)果返回再向下執(zhí) 行。
這顯然不是一個(gè)好方法。因?yàn)楝F(xiàn)在的程序經(jīng)常通過異步任務(wù)和回調(diào)方法從后臺獲取數(shù)據(jù)。嘗試UIThread測試仍然不行。
***,我發(fā)現(xiàn)下面這種方法可以行得通。只是用簡單的CountDownLatch信號對象來實(shí)現(xiàn)wait-notify機(jī)制(你也可以用syncronized(lock){... lock.notify();},只是這樣代碼并不美觀而已)
那么之前的代碼就變成了下面的模樣:
final CountDownLatch signal = new CountDownLatch(1); mLoginManager.performLoginWithUsername("username", "password", new OnLoginListener() { @Override public void onFailure(Throwable throwable) { fail(); signal.countDown(); } Override public void onSuccess(User customer) { signal.countDown(); } }); signal.await();
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。