2016-10-29 10 views
5

私はアンドロイドには新しく、バンドルの仕組みを理解しようとしています。Androidバンドル簡単なユニットテストが動作しない

次のユニットテストでブロックされます。誰かがなぜ失敗するのか説明してもらえますか?

@Test 
public void testBundle() throws Exception { 
    Bundle bundle = new Bundle(); 
    String key = "hello"; 
    String value = "world"; 
    bundle.putString(key, value); 
    Assert.assertEquals(value, bundle.getString(key)); 
} 

junit.framework.ComparisonFailure: 
Expected :world 
Actual :null 
+0

あなたはどのような環境を使用していますか?計装テスト、Robolectric、JUnit、その他? – Vasiliy

+0

こんにちはvasiliy junitテスト –

答えて

5

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上

  • 実行計装テストを

    1. モックこれらの依存関係(例えばMockito)
    2. ランテストをデバイス

    いずれにしても、unitTests.returnDefaultValues = trueはテストに信頼性がないため、非常に危険な機能です:デフォルト値はスタブメソッドによって返されましたが、機能は実際のデバイスで失敗します。消して。

  • +0

    確かに、私はこのオプションを有効にしています! –

    +0

    @HuiWangそれからあなたは間違いなくそれを無効にしてから、答えを受け入れることを検討してください) – Vasiliy

    +0

    あなたの答えをありがとう。ほんとうにありがとう。もう1つの質問は、エミュレータなしで計測されたテストを実行することは可能でしょうか?これにより私はCI –

    2

    デフォルトでBuilding Local Unit Tests

    で説明したように、AndroidのプラグインのGradleについては が含まれていませんandroid.jarライブラリの修正版と照らし合わせてローカルユニット テストを実行し、実際のコード

    あなたのテストコードは、あなたがそれから何かを取得しようとするたびに、したがって、あなたがnullを取得し、実際の実装が含まれていないBundleの剥奪のバージョンに対して実行されます。実際にBundleの動作をテストする場合は、実際のBundle実装に対してAndroidデバイスで実行される計測テストを作成することをおすすめします。

    +0

    ありがとうEgor、あなたの答えは有用ですが、Vasiliyはより完全です。ありがとう:) –

    +0

    確かに、それは素晴らしい答え、upvoted! – Egor

    関連する問題