Robolectric Shadows 官網翻譯

2021-10-21 00:27:50 字數 4333 閱讀 3073

robolectric 通過建立乙個包含真實android 框架**的執行時環境來進行工作。 這意味著,當你的測試或被測試**呼叫到android框架時,你會獲得更真實的體驗,因為這跟在實際裝置上執行的大部分**都是相同的。然而還是有一些限制:

native code(源**) - android源**不能在你的開發機器上執行。

2.out of process calls(程序外呼叫) - 你的開發機器上沒有執行android系統服務。

3.不足的測試api - android幾乎沒有適合測試的api。

robolectric通過一組名字叫做shadows的類來解決這些問題。每乙個shadow 能拓展或繼承android系統中對應類的行為。當乙個android類被例項化,robolectric會去查詢乙個對應的shadow類,如果找到了,就會去建立乙個與之關聯的shadow物件。

通過使用位元組碼工具,robolectric能夠編寫出跨平台偽實現來替代原生**,並新增額外的api來實現測試。

名字是什麼意思?

為什麼叫「shadow」?shadow 物件們不是完全的proxies, 不是完全的fakes,不是完全的mocks或stubs。shadows 有時是隱藏的,有時是可見的,並且可以引導你找到真正的物件。至少我們沒有叫它們「sheep」,這是我們正在考慮的。

shadow classes

shadow classes 總是需要乙個 public 型別的無參建構函式以便robolectric框架可以例項化他們。它們通過類宣告上的@implements注釋與它們所對映的類相關聯。

shadow 類應該模仿對映類的繼承層次關係。例如,如果你實現乙個viewgroup的shadow,shadowviewgroup,然後你的shadow類需要繼承於viewgroup的父類shadow,shadowview。例如:

@implements

(viewgroup.

class

)public

class

shadowviewgroup

extends

shadowview

}

robolectric支援在原始類上shadowing所有方法,包括private、static、final或native。

通常@implementation方法也應該有protected修飾符。 這樣做的目的是減少shadows的api表面範圍;測試者應該總是直接在android框架類上呼叫這些方法。

重要的是,shadow方法是在最初定義它們的類的相應shadow上實現的。 否則,robolectric的查詢機制將找不到它們(即使它們是在shadow子類中宣告的)。舉個例子,setenabled()方法定義在view裡面。如果setenabled()方法被定義在shadowviewgroup而不是shadowview,那麼即使在乙個例項化的viewgroup上呼叫setenabled(),它也不會在執行時被找到。

shadowing constructors

一旦乙個shadow物件被例項化,robolectric將尋找乙個名為__constructor__並帶有@implementation註解的構造方法,該方法與在真實物件上呼叫的建構函式具有相同的引數。

例如,如果應用程式**呼叫textview構數,它接收乙個context:

new textview(context);

robolectric 將會呼叫如下__constructor__接收乙個context的方法:

@implements

(textview.

class

)public

class

shadowtextview

getting access to the real instance(- 訪問真實的例項)

有時,shadow類可能想要引用它們對應類的物件,例如,操作字段。shadow類可以通過宣告乙個帶注釋的@realobject欄位來實現這一點:

@implements

(point.

class

)publicclassshadowpoint

}

在呼叫任何其他方法之前,robolectric會將realpoint設定為point的實際例項。

custom shadows(自定義)

robolectric還在改進中,我們依賴、歡迎並強烈鼓勵社群對bug修復和功能缺陷的貢獻。然而,如果你想以一種不適合共享的方式修改陰影行為,或者你不能等待乙個新版本包含乙個關鍵的修復,我們支援自定義陰影。

writing a custom shadow(書寫乙個自定義的shadows)

@implements

(bitmap.

class

)public

class

myshadowbitmap

public

intgetquality()

}

using a custom shadows

使用shadows陣列屬性,在測試類或測試方法上使用@config注釋將自定義shadow連線到robolectric。要使用上一節中提到的myshadowbitmap類,您需要用@config(shadows=)注釋有問題的測試,如果包含多個自定義shadow:@config(shadows=)。這使得robolectric在對被隱藏的類執行**時能夠識別並使用自定義的陰影。

如果您希望將自定義shadow應用於套件或某個包中的所有測試,則可以通過robolectric配置shadow robolectric.properties檔案。注意,預設情況下shadows. shadowof()方法不適用於自定義陰影。相反,您可以使用shadow.extract()並將返回值轉換為您實現的自定義shadow類。

building a library of custom shadows.

如果您發現自己正在構建乙個自定義shadow庫,那麼您應該考慮在您的shadow庫上執行robolectric的shadow注釋處理器。這提供了許多好處,例如

為你的每乙個shadow生成shadowof方法

生成乙個serviceloader,這樣如果在類路徑中找到自定義shadow,就會自動應用它

在teardown時呼叫任何static @resetter方法,使您能夠重置靜態狀態。

對shadow執行額外的驗證和檢查。

android }}

}dependencies

最佳實踐:

limit api su***ce area of shadows.

因為robolectric 3.7的@implementation方法,包括__constructor__方法可以被保護。這是可取的,因為測試**沒有業務呼叫這些方法,通過使您的@implementation方法受保護,你鼓勵測試作者呼叫公共android api代替。

don』t use useinheritimplementationmethods

這通常是不必要的,在robolectric 3.8中將被移除

不要在shadows中重寫 eaquls, hashcode 和 tostring

避免這種情況。要在測試中測試相等性以進行比較,請選擇輔助程式庫或斷言庫。更喜歡新增乙個describe()方法,而不是shadowing tostring()

編寫高質量的shadow,以促進測試行為而不是實現。

比起使用shadow作為美化的論據,更喜歡編寫乙個shadow來鼓勵測試行為。例如,不要新增公開已註冊偵聽器的方法,而要為呼叫這些偵聽器的方法新增@implementation。

在shadow自己的**時要小心

robolectric提供了大量的能力,這需要負責任的使用。shadows是測試與android框架互動的理想工具,因為該框架不支援依賴注入,並且可以自由使用靜態**。在為自己的**編寫自定shadow之前,請考慮是否不能更好地重構**並使用流行的模仿庫(如mockito)。

個人總結:

robolectric通過shadow的來對映android 中的類,這樣就可以直接在單元測試中使用android的類。當robolectric中提供的shadow沒有你需要的類的時候,比如你的自定義view的類,在robolectric中必然是沒有的,這個時候就可以使用自定義shadow來實現。

Auto Layout Guide官網文件翻譯

基於對這些檢視的約束,自動布局 auto layout 會動態的計算檢視層級中所有檢視的大小和位置。例如,你可以約束乙個按鈕,使其與乙個影象檢視保持水平居中,並且使該按鈕的頂部始終在影象檢視的底部下方的8點距離處。如果影象檢視的大小和位置發生了變化,按鈕的位置將會自動調整以匹配約束的位置。這種基於約...

10 10 010 簡介 官網 官網翻譯

netty是 乙個非同步事件驅動的網路應用程式框架,用於快速開發可維護的高效能協議伺服器和客戶端。netty是乙個nio客戶端伺服器框架,可以快速輕鬆地開發協議伺服器和客戶端等網路應用程式。它極大地簡化並簡化了tcp和udp套接字伺服器等網路程式設計。快速簡便 並不意味著最終的應用程式會受到可維護性...

官翻 隱藏狀態列

官網原文 隱藏狀態列 這個課程將描述如何在不同版本的上隱藏狀態列。隱藏狀態列 可選 導航欄 可以讓你的內容有更多的空間可以顯示,從而為使用者提供乙個更有沉浸式的體驗。圖1展示了乙個可見的狀態列的程式介面 圖1 狀態列可見 圖2展示了乙個不可見的狀態列的程式介面,注意 這個action bar也被隱藏...