作者:Antonio Leiva 時間:Apr 25, 2017 原文鏈接:https://antonioleiva.com/unit-tests-android-kotlin/ 當然,Kotlin也允許我們以非常簡單的方法進行單元測試,它非常類似我們在Java中進行的那樣。 當我們使用想Mocki ...
時間:Apr 25, 2017
原文鏈接:https://antonioleiva.com/unit-tests-android-kotlin/
當然,Kotlin也允許我們以非常簡單的方法進行單元測試,它非常類似我們在Java中進行的那樣。
當我們使用想Mockito庫時,有一些小的複雜,但是,我們會看到一些技巧使它更容易。
Kotlin的單元測試
雖然,單一測試題目總是存在爭議,我不打算在這裡對此進行詳細說明。
對於我們的例子,只要意識到單元測試是不需要設備進行運行的測試就足夠了。IDE能夠執行它們,並顯示結果,識別出哪些執行了,哪些是失敗了。
配置Gradle
你需要加jUnit到你的依賴關係中。在創建項目時,由於這是預設配置,它可能已經包括了。我們還要加Mockito,這在後面要用到它。
1 testCompile "junit:junit:4.12" 2 testCompile "org.mockito:mockito-core:1.10.19"
創建第一個測試
在app/src/test文件夾中(如果它不存在,你可以創建它),你可創建一個叫做MyTest的新類,它類似這樣:
1 class MyTest { 2 3 @Test 4 fun testsWork() { 5 assertTrue(true) 6 } 7 }
如你所見,它非常類似我們在Java中使用的那樣。
怎樣用Mockito
在Kotlin中,雖然你可能發現使用Mockito有些複雜,但是,還是可以像使用其它庫一樣使用Mockito。這些複雜的點,就是需要我們來解決的。
這是書中的例子:
1 @Test 2 fun emptyDatabaseReturnsServerValue() { 3 val db = Mockito.mock(ForecastDataSource::class.java) 4 val server = Mockito.mock(ForecastDataSource::class.java) 5 `when`(server.requestForecastByZipCode(any(Long::class.java), any(Long::class.java))) 6 .then { ForecastList(0, "city", "country", listOf()) } 7 8 val provider = ForecastProvider(listOf(db, server)) 9 assertNotNull(provider.requestByZipCode(0, 0)) 10 }
你看,所有的都非常類似。你能夠創建自己mock,併在整個代碼中無縫地使用它們,你也能夠用’MockitoJUnitRunner’和註解。
when字是Kotlin的保留字,所以你需要用反轉逗號,甚至你可以用import重命名,給它所需的名稱:
1 import org.mockito.Mockito.`when` as _when
在你輸入mock類型時,問題出現了,它不允許null值。預設情況下,Mockito為mock對象指定null值,這問題遲早會出現的。
有個技巧可以用於這個:mockit-kotlin,它不用null了,而是預設的為每個類型給出具體值,來解決這一個問題。另外,它還利用Kotlin的優勢提供了其他函數,使事情更簡單。
另一個問題是,預設情況下,Kotlin的所有類和函數都被關閉,也就是它們不能被擴展。由於不能模擬它們,這是Mockito的問題。
但這已不是問題了,Mockito 2允許模擬最終的對象了。
在後續文章中,我們讀到怎樣使用它。
一件有趣的小事
Kotlin允許我們比Java更靈活命名函數。如果我們反轉逗號,我們可以把想到的任何文字放在其中。
這對測試非常有用,其中最重要的是測試名稱能夠完美地描述了你要做事,以便能夠更規範。
因此,你能夠有這樣的名稱的測試:
1 @Test fun `test something works as expected`() { 2 Assert.assertTrue(false) 3 }
除了提高可讀性外,最好的是可以在測試失敗時候輸出更容易理解的結果。你會看到更清晰錯誤。
如果在Android項目中使用它,你會看到它顯示一個Lint錯誤,指示Android項目的方法不能有空格。在我的測試中,我沒有註意到這可能是一個問題。 Gradle運行它們沒有問題,所以你可以添加註釋來忽略錯誤。
無論如何,請記住只用於測試。
結論
雖然理論上,在Java中,我們可以使用的測試工具,在Kotlin中,應該沒有問題,但是基於反射和對代碼添加null確實給我們帶來了一些問題。
Kotlin非常關註無效代碼,這在某些情況下可能是個粘滯點。但是,有越來越多的替代方法可以以簡單的方式進行的,而與Mockito 2相比,所有這些問題都將消失。
除了這些小缺陷之外,其他一切都與Java一樣。
想要繼續學習Kotlin?只需查閱我寫的有關該主題的所有文章。