ローカル単体テストを作成する

ローカルテストは、Android ではなく独自のワークステーションで直接実行されます。 ダウンロードしますそのため、ローカルの Java 仮想マシン(JVM)を使用し、 Android デバイスではなくテストを実行します。ローカルテストでは アプリのロジックを高速化できますただし、外部 IP アドレスを持つ Android フレームワークでは、実行できるテストの種類に制限が設けられています。

単体テストは、コードの小さなセクション( テストをご覧ください。そのコードを実行し、結果を確認します。

通常、単体テストはシンプルですが、単体テストがうまくいかない場合には テスト対象は、テスト性を念頭に置いて設計されていません。

  • 検証するコードは、テストからアクセス可能である必要があります。対象 プライベート メソッドを直接テストすることはできません。代わりに、クラスでテストし、 公開 API を使用します。
  • 単体テストを単独で実行するには、単体テストと 偽のテストやモニタリングなどの管理下にあるコンポーネントで その他のテストダブルです。コードが依存関係に依存している場合、これは特に問題になります。 実装します。

Android での一般的な単体テストの戦略については、 テストをご覧ください。

ローカルテストの場所

デフォルトでは、ローカル単体テストのソースファイルは module-name/src/test/。このディレクトリは、新規作成したときにすでに存在しています。 プロジェクトを作成します。

テスト用の依存関係の追加

また、Terraform を使用してプロジェクトのテスト依存関係を JUnit テスト フレームワークによって提供される標準 API。

これを行うには、アプリのモジュールの build.gradle ファイルを開き、以下を指定します。 使用できます。testImplementation 関数を使用して ローカルテストのソースセットに適用し、アプリケーションには適用できません。

dependencies {
  // Required -- JUnit 4 framework
  testImplementation "junit:junit:$jUnitVersion"
  // Optional -- Robolectric environment
  testImplementation "androidx.test:core:$androidXTestVersion"
  // Optional -- Mockito framework
  testImplementation "org.mockito:mockito-core:$mockitoVersion"
  // Optional -- mockito-kotlin
  testImplementation "org.mockito.kotlin:mockito-kotlin:$mockitoKotlinVersion"
  // Optional -- Mockk framework
  testImplementation "io.mockk:mockk:$mockkVersion"
}

ローカル単体テストクラスを作成する

ローカル単体テストクラスは、JUnit 4 テストクラスとして記述します。

そのためには、1 つ以上のテストメソッドを含むクラスを作成します。通常は module-name/src/test/。テストメソッドは @Test アノテーションで始まり、 コンポーネントの 1 つの側面を実行して検証する コードが含まれています 選択します

次の例は、ローカル単体テストクラスを実装する方法を示しています。「 テストメソッドのemailValidator_correctEmailSimple_returnsTrue()検証試行回数 アプリ内のメソッドである isValidEmail()。テスト関数が次のレスポンスを返します。 isValidEmail() も true を返す場合は true。

Kotlin

import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Test

class EmailValidatorTest {
  @Test fun emailValidator_CorrectEmailSimple_ReturnsTrue() {
    assertTrue(EmailValidator.isValidEmail("[email protected]"))
  }

}

Java

import org.junit.Test;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

class EmailValidatorTest {
  @Test
  public void emailValidator_CorrectEmailSimple_ReturnsTrue() {
    assertTrue(EmailValidator.isValidEmail("[email protected]"));
  }
}

読みやすいテストを作成して、アプリケーションのコンポーネントが 想定どおりの結果が返されます。次のように、アサーション ライブラリを使用して、 junit.AssertHamcrest真実。上記のスニペットは、BigQuery の junit.Assert

モック可能な Android ライブラリ

ローカル単体テストを実行すると、Android Gradle プラグインに このライブラリには、Android フレームワークのすべての API を プロジェクトで使用しているバージョン。このライブラリには、すべての public メソッドと クラスですが、メソッド内のコードは削除されています。該当する場合 すべてのメソッドがアクセスされると、テストは例外をスローします。

これにより、Android 内でクラスを参照する際にローカルテストを作成できるようになります。 フレームワーク(Context など)です。さらに重要な点として モックを使用して 実装する方法を学びました

Android 依存関係のモック

よくある問題は、クラスが文字列リソースを使用していることが判明することです。Google Chat では ContextgetString() メソッドを呼び出して文字列リソースを取得する クラスです。ただし、ローカルテストでは Context やそのメソッドを以下のとおり使用することはできません。 Android フレームワークに属します。getString() の呼び出しは次のようになります。 クラスから削除しましたが、これは必ずしも現実的ではありません。これを解決するには、 次の場合に常に同じ値を返す Context のモックまたはスタブを作成します。 getString() メソッドが呼び出されます。

Mockable Android ライブラリと、 Mockito または MockK を使用すると、 単体テストで Android クラスのモックの動作を確認する。

Mockito を使用してローカル単体テストにモック オブジェクトを追加するには、次の手順を実施します。 プログラミング モデル:

  1. 次のように、build.gradle ファイルに Mockito ライブラリの依存関係を含めます。 テスト環境を設定するをご覧ください。
  2. 単体テストクラスの定義の先頭に、 @RunWith(MockitoJUnitRunner.class) アノテーション。このアノテーションは、 Mockito テストランナー: フレームワークの使用状況が正しく、 モック オブジェクトの初期化を簡素化します。
  3. Android の依存関係用のモック オブジェクトを作成するには、@Mock アノテーションを追加します。 指定する必要があります。
  4. 依存関係の動作をスタブするには、条件を指定して when()thenReturn() を使用して条件が満たされた場合の戻り値 あります。

次の例は、モックを使用する単体テストの作成方法を示しています。 Mockito-Kotlin で作成された Kotlin の Context オブジェクト。

import android.content.Context
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.junit.MockitoJUnitRunner
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock

private const val FAKE_STRING = "HELLO WORLD"

@RunWith(MockitoJUnitRunner::class)
class MockedContextTest {

  @Mock
  private lateinit var mockContext: Context

  @Test
  fun readStringFromContext_LocalizedString() {
    // Given a mocked Context injected into the object under test...
    val mockContext = mock<Context> {
        on { getString(R.string.name_label) } doReturn FAKE_STRING
    }

    val myObjectUnderTest = ClassUnderTest(mockContext)

    // ...when the string is returned from the object under test...
    val result: String = myObjectUnderTest.getName()

    // ...then the result should be the expected one.
    assertEquals(result, FAKE_STRING)
  }
}

Mockito フレームワークの使用方法について詳しくは、Mockito API リファレンスSharedPreferencesHelperTest クラスを サンプルコードをご覧ください。また、Android テスト Codelab もお試しください。

エラー: 「Method ... not mocked」

Mockable Android ライブラリは、Mockable Android ライブラリが メソッドを Error: "Method ... not mocked メッセージと併用します。

スローされた例外がテストに問題がある場合は、 動作に応じてメソッドが代わりに null またはゼロを返し、 戻り値の型です。そのためには、プロジェクトのプロジェクトに次の構成を追加します。 Groovy のトップレベルの build.gradle ファイルは次のようになります。

android {
  ...
  testOptions {
    unitTests.returnDefaultValues = true
  }