成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何在Android上測試異步任務

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

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

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

  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.    

這是一個非常明顯的示例:實際開發(fā)中,我們想要測試例如HTTP響應、SQL存儲等等。在Sixt我們遵從一種Manager/Model方法:每 個Model包含一個實體(車、顧客等)的表現。每個Manager用不同的模型(例如,我們的LoginManager可能需要用戶與之交互的模型)聚 合成一套功能。

大多數的Manager集中執(zhí)行HTTP請求是要從后臺獲取數據。例如,我們用下面的代碼來執(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. }); 

應用到我們自己的測試集合后,當得到預期之外的結果時,只是讓這一結果失敗。我們可以看到為什么在onFailure()函數中我們調用了 fail()。接下來,即使我用一個錯誤的用戶名也能通過這個測試。思前想后,測試似乎是按照代碼順序執(zhí)行的,但并沒有等到回調函數的結果返回再向下執(zhí) 行。

這顯然不是一個好方法。因為現在的程序經常通過異步任務和回調方法從后臺獲取數據。嘗試UIThread測試仍然不行。

***,我發(fā)現下面這種方法可以行得通。只是用簡單的CountDownLatch信號對象來實現wait-notify機制(你也可以用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(); 

 

責任編輯:閆佳明 來源: blog.jobbole
相關推薦

2022-08-30 19:14:31

LinuxBash

2022-09-13 08:40:24

AndroidLinux

2019-05-29 08:00:00

Linux計劃任務cron

2017-02-27 18:26:45

UbuntuADBAndroid

2019-04-29 10:00:50

Windows 10全屏模式任務欄

2013-08-07 09:58:01

2015-12-29 13:59:53

Ubuntu 15.0CentOS 7Android Stu

2011-10-31 15:40:07

TouchpadAndroid

2023-07-31 08:05:30

Spring任務調度

2019-07-22 08:05:21

MacOSElasticsear

2021-07-10 11:20:44

FreeDOS歸檔文件

2020-07-08 15:29:05

MacJava編程語言

2020-06-22 08:50:15

WindowsPython編程語言

2021-10-02 10:10:47

LinuxBusyBox命令

2018-12-11 11:00:50

Linux字體命令

2018-10-15 15:23:50

UbuntupipPython

2020-04-21 14:21:31

LinuxPython

2019-08-30 11:20:28

UbuntuVirtualBoxLinux

2023-11-26 16:23:16

FedoraVSCodium

2023-08-08 12:38:52

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美成人h版在线观看 | 成人一区二区三区在线观看 | 欧美久久国产 | 亚洲综合一区二区三区 | 欧美精品乱码久久久久久按摩 | 午夜影院中文字幕 | www国产成人免费观看视频,深夜成人网 | 日本视频中文字幕 | 天天影视亚洲综合网 | 午夜精 | 韩日在线观看视频 | 久久国产精品久久国产精品 | 91高清视频在线观看 | 日韩免费视频一区二区 | 久久久久国产精品免费免费搜索 | 久久大陆 | 久热免费 | 欧美性大战久久久久久久蜜臀 | 亚洲网址在线观看 | 国内av在线| 91看片免费 | 欧美不卡一区 | 伊人青青久久 | 91精品久久久久久久久 | 欧美在线 | 亚洲福利在线观看 | 在线播放国产一区二区三区 | 色视频网站 | 一级毛片高清 | 天天射色综合 | 在线观看国产三级 | 中文字幕在线一区 | 亚洲高清av在线 | 一区二区三区免费 | 亚洲永久| 精品国产三级 | 西西裸体做爰视频 | 日韩欧美操 | 色成人免费网站 | 91看片在线观看 | 欧美日韩国产免费 |