偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

如何在Android上測(cè)試異步任務(wù)

移動(dòng)開發(fā) Android
Android中的測(cè)試(寬泛的定義)是一個(gè)單元測(cè)試集合的擴(kuò)展。涉及初始化、關(guān)閉測(cè)試,包含setUp()和tearDown()操作,使用反射 的方式推斷出不同的測(cè)試方式(從JUnit4開始我們就可以使用注釋來(lái)指定的優(yōu)先級(jí)和執(zhí)行所有測(cè)試)。

最近,在Sixt(德國(guó)比較大的一個(gè)汽車租賃網(wǎng)站)上,我們把我們的開發(fā)環(huán)境從Eclipse遷移到Android Studio。這也就意味著我們進(jìn)入了新的編譯系統(tǒng)——Gradle,并且把TDD(測(cè)試驅(qū)動(dòng)開發(fā))和CI(持續(xù)集成)納入我們的軟件開發(fā)流程。這里不是 討論在軟件開發(fā)中引入CI會(huì)帶來(lái)怎樣的好處,而是討論在Android中當(dāng)測(cè)試UI之外的線程時(shí)會(huì)出現(xiàn)的問(wèn)題。

Android中的測(cè)試(寬泛的定義)是一個(gè)單元測(cè)試集合的擴(kuò)展。涉及初始化、關(guān)閉測(cè)試,包含setUp()和tearDown()操作,使用反射 的方式推斷出不同的測(cè)試方式(從JUnit4開始我們就可以使用注釋來(lái)指定的優(yōu)先級(jí)和執(zhí)行所有測(cè)試)。一個(gè)典型的測(cè)試結(jié)構(gòu)如下:

  1. public class MyManagerTest extends ActivityTestCase { 
  2.    
  3.     public MyManagerTest(String name) { 
  4.         super(name); 
  5.     } 
  6.    
  7.     protected void setUp() throws Exception { 
  8.         super.setUp(); 
  9.     } 
  10.    
  11.     protected void tearDown() throws Exception { 
  12.         super.tearDown(); 
  13.     } 
  14.    
  15.     public void testDummyTest() { 
  16.         fail("Failing test"); 
  17.     } 
  18.    

這是一個(gè)非常明顯的示例:實(shí)際開發(fā)中,我們想要測(cè)試?yán)鏗TTP響應(yīng)、SQL存儲(chǔ)等等。在Sixt我們遵從一種Manager/Model方法:每 個(gè)Model包含一個(gè)實(shí)體(車、顧客等)的表現(xiàn)。每個(gè)Manager用不同的模型(例如,我們的LoginManager可能需要用戶與之交互的模型)聚 合成一套功能。

大多數(shù)的Manager集中執(zhí)行HTTP請(qǐng)求是要從后臺(tái)獲取數(shù)據(jù)。例如,我們用下面的代碼來(lái)執(zhí)行用戶的登錄:

  1. mLoginManager.performLoginWithUsername("username""password"new OnLoginListener() { 
  2.     @Override 
  3.     public void onFailure(Throwable throwable) { 
  4.         fail(); 
  5.     } 
  6.   
  7.     Override 
  8.     public void onSuccess(User customer) { 
  9.     //.. 
  10.     } 
  11. }); 

應(yīng)用到我們自己的測(cè)試集合后,當(dāng)?shù)玫筋A(yù)期之外的結(jié)果時(shí),只是讓這一結(jié)果失敗。我們可以看到為什么在onFailure()函數(shù)中我們調(diào)用了 fail()。接下來(lái),即使我用一個(gè)錯(cuò)誤的用戶名也能通過(guò)這個(gè)測(cè)試。思前想后,測(cè)試似乎是按照代碼順序執(zhí)行的,但并沒(méi)有等到回調(diào)函數(shù)的結(jié)果返回再向下執(zhí) 行。

這顯然不是一個(gè)好方法。因?yàn)楝F(xiàn)在的程序經(jīng)常通過(guò)異步任務(wù)和回調(diào)方法從后臺(tái)獲取數(shù)據(jù)。嘗試UIThread測(cè)試仍然不行。

***,我發(fā)現(xiàn)下面這種方法可以行得通。只是用簡(jiǎn)單的CountDownLatch信號(hào)對(duì)象來(lái)實(shí)現(xiàn)wait-notify機(jī)制(你也可以用syncronized(lock){... lock.notify();},只是這樣代碼并不美觀而已)

那么之前的代碼就變成了下面的模樣:

  1. final CountDownLatch signal = new CountDownLatch(1); 
  2. mLoginManager.performLoginWithUsername("username""password"new OnLoginListener() { 
  3.     @Override 
  4.     public void onFailure(Throwable throwable) { 
  5.         fail(); 
  6.         signal.countDown(); 
  7.     } 
  8.   
  9.     Override 
  10.     public void onSuccess(User customer) { 
  11.         signal.countDown(); 
  12.     } 
  13. }); 
  14. signal.await(); 

 

責(zé)任編輯:閆佳明 來(lái)源: blog.jobbole
相關(guān)推薦

2019-05-29 08:00:00

Linux計(jì)劃任務(wù)cron

2022-08-30 19:14:31

LinuxBash

2022-09-13 08:40:24

AndroidLinux

2013-08-07 09:58:01

2019-10-23 10:40:06

Windows 10任務(wù)欄截圖工具

2017-02-27 18:26:45

UbuntuADBAndroid

2023-07-31 08:05:30

Spring任務(wù)調(diào)度

2019-01-04 10:45:31

Windows 10Android應(yīng)用程序

2018-07-30 09:42:09

AndroidWineWindows App

2019-04-29 10:00:50

Windows 10全屏模式任務(wù)欄

2019-08-02 15:30:42

UbuntuMongoDB命令

2019-07-23 09:10:41

MacOSKibana開源

2021-07-25 10:34:17

FedoraPodmanLinux

2019-01-07 09:50:06

Linuxtarball命令

2019-11-26 16:58:51

Linuxpkgsrc

2019-07-12 16:28:32

MacKubernetes

2019-11-26 09:20:47

LinuxJava

2023-01-17 07:40:59

LinuxAppImage應(yīng)用程序

2023-01-28 16:16:42

WindowsPython

2011-10-31 15:40:07

TouchpadAndroid
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)