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

ローカルテストは、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("name@email.com"))
  }

}

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("name@email.com"));
  }
}

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

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

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

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

Android 依存関係のモック

よくある問題は、クラスが文字列リソースを使用していることが判明することです。Google Chat では Context の getString() メソッドを呼び出して文字列リソースを取得する クラスです。ただし、ローカルテストでは 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
  }