14

Kotlin拡張機能は素晴らしいです。しかし、私はそれらのユニットテストをどのように実行できますか?特に、Android SDKのクラス(例えば、コンテキスト、ダイアログ)がクラスを提供しています。Android SDKクラスのKotlin拡張機能のユニットテスト

私は以下の2つの例を提供しています。誰かがユニットテストの仕方を分かち合うことができます。

fun Context.getColorById(colorId: Int): Int { 
    if (Build.VERSION.SDK_INT >= 23) 
     return ContextCompat.getColor(this, colorId) 
    else return resources.getColor(colorId) 
} 

fun Dialog.setupErrorDialog(body : String, onOkFunc:() -> Unit = {}): Dialog { 
    window.requestFeature(Window.FEATURE_NO_TITLE) 
    this.setContentView(R.layout.dialog_error_layout) 

    (findViewById(R.id.txt_body) as TextView).text = body 
    (findViewById(R.id.txt_header) as TextView).text = context.getString(R.string.dialog_title_error) 
    (findViewById(R.id.txt_okay)).setOnClickListener{ 
     onOkFunc() 
     dismiss() 
    } 
    return this 
} 

任意の提案が役立つだろう。ありがとう!

+1

こんにちは、私はこれらの機能をユニットテストする必要はないと思います。まず、アンドロイドのリソースから色を取得し、あなたのアプリケーションコードに依存しません。もう1つはerrorDialogを示しています。エスプレッソやRobotiumなどのUIテストフレームワークを使用して正しく表示されているかどうかを確認してください。 – piotrek1543

+0

ありがとうpiotrek。コードは単なる例です。問題の主なポイントは、テストするために必要なロジックがある場合に、エクステンション機能でユニットテストを実行する方法を探ることです。これは達成不可能なものなのでしょうか、何かが欠けていますか?ありがとう。 – Elye

+0

私はそれも探しています。あなたはそれを@Elye見つけましたか? – elsennov

答えて

2

現在、Androidクラスの拡張機能をテストする方法は、Androidクラスを嘲笑することです。これは最適な解決策ではありません。テスト中のクラスを模倣し、関数がどのように動作するかについての特定の知識が必要です(拡張機能は静的関数として実装されているため、受け入れられると思います)。誰かが何か良いものを思い付くまで。

例として、JsonArrayクラスを考えてみましょう。私たちは、最後の項目のインデックスを受信するための拡張機能を定義しました:

fun JSONArray.lastIndex() = length() - 1 

Spekテストフレームワークとmockito-kotlinを使用)による試験は次のようになります。

@RunWith(JUnitPlatform::class) 
object JsonExtensionTestSpec : Spek({ 

    given("a JSON array with three entries") { 
     val jsonArray = mock<JSONArray> { 
      on { length() } doReturn 3 
     } 

     on("getting the index of the last item") { 
      val lastIndex = jsonArray.lastIndex() 

      it("should be 2") { 
       lastIndex shouldBe 2 
      } 
     } 
    } 

    given("a JSON array with no entries") { 
     val jsonArray = mock<JSONArray>({ 
      on { length() } doReturn 0 
     }) 

     on("getting the index of the last item") { 
      val lastIndex = jsonArray.lastIndex() 

      it("should be -1") { 
       lastIndex shouldBe -1 
      } 
     } 
    } 
}) 

あなたの機能の難しさは、Androidクラスも内部的に使用していることです。残念ながら、私は今この解決策を持っていません。

関連する問題