在Android上Kotlin的單元測試(KAD22),kotlinkad22

來源:互聯網
上載者:User

在Android上Kotlin的單元測試(KAD22),kotlinkad22

作者:Antonio Leiva

時間: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     @Test4     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?只需查閱我寫的有關該主題的所有文章。

 

 

 

 

 

 

 

 

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.