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

来源:http://www.cnblogs.com/figozhg/archive/2017/04/30/6790376.html
-Advertisement-
Play Games

作者:Antonio Leiva 時間:Apr 25, 2017 原文鏈接:https://antonioleiva.com/unit-tests-android-kotlin/ 當然,Kotlin也允許我們以非常簡單的方法進行單元測試,它非常類似我們在Java中進行的那樣。 當我們使用想Mocki ...


作者: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     @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值。預設情況下,Mockitomock對象指定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只需查閱寫的有關該主題的所有文章

 

 

 

 

 

 

 

 

 

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 提到響應式,就不得不提兩個響應式框架——bootstrap和foundation。今天給大家介紹的是foundation框架。 何為“嘗鮮”?就是帶大伙初步瞭解一下foundation的靈活和強大; 何為“踩坑”?就是我把我使用的時候踩過的坑給標個記號,這樣大伙用的時候就可以“繞道而行“啦! ...
  • 博客園有很多漂亮的皮膚,但總是有一些地方我不大喜歡,所以經過慎重考慮,我決定親自動手換個裝。本文將介紹博客園換裝的一些基礎(不涉及標準皮膚的做法),如果你想讓你的博客更炫,可以參考本文入個門,然後自己慢慢摸索。相信你一定比我做的好。 ...
  • 以我的經驗來說,要讓TemplatedControl支持Command的需求不會很多,大部分情況用附加屬性解決這個需求會更便利些,譬如UWPCommunityToolkit的 "HyperlinkExtensions" 。 如果正在從頭設計自定義控制項並真的需要提供命令支持,可以參考這篇文章。支持Co ...
  • 一、簡介 1. NSSession 是 iOS 7 之後發佈的,代替原來的 NSURLConnection 2. NSURLSession 中的請求都看做一個請求任務(task),task 的繼承關係如下圖 NSURLSessionTask 是一個抽象類,提供了一些基本的方法 NSURLSessio ...
  • 眾所周知,view是通過刷新來重繪視圖的,Android系統通過發出VSYNC信號來進行屏幕重繪,刷新的時間間隔為16ms,如果在16ms內view完成你所需要的所有操作,那麼用戶在視覺上就不會產生卡頓的感覺;而如果執行的操作邏輯太多,特別是需要頻繁刷新的界面,就會不斷阻塞主線程,從而導致畫面卡頓。 ...
  • 在預設情況下,RadioButton的 文字位置和文字的距離是不變的,為了可以改變它,我們可以用以下的方法。 1.改變文字的位置 1.改變文字的距離 這樣就OK了 ...
  • AndroidManifest.xml 需要註意的是,在聲明許可權時需要一個android:protectionLevel的屬性,它代表“風險級別”。必須是以下值之一: normal、dangerous、signature、signatureOrSystem。normal表示許可權是低風險的,不會對系統 ...
  • 先看一下效果圖: 我們需要獲取圖片的高度,並且設置滾動監聽,隨著滾動的距離來設置標題欄的顏色透明度和字體顏色的透明度 github:https://github.com/ganchuanpu/GradationTitleBar ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...