JUnitテストは、すべてのAndroidソースコードが存在せず、スタブクラス(hereと記載されている)だけを持つローカルマシンで実行されます。これらのスタブクラスを使用すると、Androidアプリケーションをコンパイルすることができます(そのAPIは実際のAndroidフレームワークと同一であるため)。ただし、それらを軽くするためにロジックは含まれていません。
デフォルトでは、スタブメソッドのいずれかを呼び出そうとすると例外が発生します。このような何か:
public Bundle() {
throw new RuntimeException("Stub!");
}
この「失敗高速」アプローチが誤ってこれらのスタブクラスに対してそのコードを実行し、それが動作しない理由を疑問に思うから開発者を防ぐために採用されました。
しかし、この動作はbuild.gradle
にこの設定で変更することができます。
android {
...
testOptions {
unitTests.returnDefaultValues = true
}
}
これはスタブメソッドが例外をスローするのではなく、デフォルト値を返します。
この機能が有効になっている可能性があります。したがって、JUnitテストを実行すると例外は発生しませんが、Bundle#getString()
メソッドはデフォルト値(null
)を返します。
あなたは、Androidフレームワークの依存関係を持っているコードをテストしたい場合は、のいずれかを実行する必要があります。Robolectric Android上
実行計装テストを
- モックこれらの依存関係(例えばMockito)
- ランテストをデバイス
いずれにしても、unitTests.returnDefaultValues = true
はテストに信頼性がないため、非常に危険な機能です:デフォルト値はスタブメソッドによって返されましたが、機能は実際のデバイスで失敗します。消して。
あなたはどのような環境を使用していますか?計装テスト、Robolectric、JUnit、その他? – Vasiliy
こんにちはvasiliy junitテスト –