Robolectricでアプリケーションのコンテキストにアクセスするにはどうすればよいですか?


112

実際には、API呼び出しの応答を取得する必要がありますContext。そのために必要でした。

回答:


218

更新。

バージョン1.xおよび2.xに使用するだけです。

Robolectric.application;

そしてバージョン3.xの場合:

RuntimeEnvironment.application;

そして、バージョン4.xの場合:

  • build.gradleファイルに追加:

    testImplementation 'androidx.test:core:1.0.0'
    
  • コンテキストを取得するには:

    ApplicationProvider.getApplicationContext()
    

11
テストに@RunWith(RobolectricTestRunner.class)を入れましたか?
Eugen Martynov

4
ええ..追加しましたが、それでもnullを返します
user1667968

1
私はあなたが言ったことをすべてやったが、それでもnullになる。他に欠けているものはありますか?
モイゼスヒメネス

13
また、Robolectricはその時点でおそらく初期化されず、値はになるためRuntimeEnvironment.application、静的コード(で注釈が付けられたメソッドなど@BeforeClass)で使用しないでくださいnull
sfera

1
また、これによりアプリケーションはテスト間で出血します。これは望ましくない場合があります
Chris

26

使用できます

RuntimeEnvironment.application

4
RoboElectric 3.0では、Roboelectric.applicationはもう存在しないため、これがおそらく最良の答えです
kenyee


16

追加

testImplementation "androidx.test:core-ktx:${deps.testrunner}"

そして使用:

private val app = ApplicationProvider.getApplicationContext()

import androidx.test.core.app.ApplicationProvider
luckyhandler

val appContext = ApplicationProvider.getApplicationContext <Context>()
luckyhandler

2
これが最新のRobolectricの正解です。ここで言及されている他のメソッドは非推奨または削除されています。
ガボール

7

2019年現在の最新のRobolectric 4.3について `

ShadowApplication.getInstance()

`と

Roboletric.application

両方とも低価格です。だから私は使っています

Context context = RuntimeEnvironment.systemContext;

コンテキストを取得します。


5

アプリケーションコンテキストを取得するには、次の操作を行う必要があります。

  1. @RunWith(RobolectricTestRunner.class)に注釈を付ける
  2. RuntimeEnvironment.application.getApplicationContext()

2

これはRobolectric 3.5.1で私のために働きます: ShadowApplication.getInstance().applicationContext


4.0リリースではこのメソッドが削除されるようです。に固執するRuntimeEnvironment.applicationRuntimeEnvironment.application.getApplicationContext()、それがあなたのために働くなら、より良い。
qix 2018

2

7月21日のリリース4.0-alpha-3以降、それらは削除されました ShadowApplication.getApplicationContext()。でRuntimeEnvironment.application.getApplicationContext()注釈が付けられたすべてのテストに固執し@RunWith(RobolectricTestRunner::class)ます。

余談ですが、現在のガイドには、次を使用して文字列リソースを取得する例があります。

final Context context = RuntimeEnvironment.application;

(注のJavadocことRuntimeEnvironmentとはShadowApplication、現在非アルファ3.xの放出を反映しています。)


2

まず、次のものをに追加しますbuild.gradle

testImplementation 'androidx.test:core:1.2.0'

次に使用します:

ApplicationProvider.getApplicationContext() as Application


2

場合によっては、Robolectrisのデフォルトコンテキストではなく、アプリのコンテキストが必要になることがあります。たとえば、パッケージ名を取得したい場合などです。デフォルトでは、Robolectricはorg.robolectric.defaultパッケージ名を返します。実際のパッケージ名を取得するには、次のようにします。

build.gradle

testImplementation 'org.robolectric:robolectric:4.2.1'

あなたのテストクラス:

@RunWith(RobolectricTestRunner.class)
@Config( manifest="AndroidManifest.xml")
public class FooTest {

@Test
public void fooTestWithPackageName(){
    Context context = ApplicationProvider.getApplicationContext();
    System.out.println("My Real Package Name: " + context.getPackageName());
}

}

実行/デバッグ構成の作業ディレクトリが$ MODULE_DIR $に設定されていることを確認してください ここに画像の説明を入力してください ここに画像の説明を入力してください


1

使用する方が安全であるRobolectric.getShadowApplication()使用するのではなくRobolectric.application、直接。


しかし、カスタムアプリケーションのカスタムプロパティにアクセスする必要がある場合はどうなりますか?シャドウアプリケーションから実際のオブジェクトを取得できないようです。
Denis Kniazhev

@DenisKniazhevごめんなさい、お答えできません。Robolectricを使い始めてすぐに、CIとしてTravisを使い始めましたが、うまく機能しません。私の推測では、それをアプリケーションにキャストするか、そのようにアクセスするためにカスタムランナーを作成する必要があるかもしれません。幸運
drspaceboo 2015年

おかげで、今のところ私はちょうど固執していますRobolectric.application
デニス・クニャジェフ

6
Robolectric.getShadowApplication()は使用できません
IgorGanapolsky 2017

1

@EugenMartynovおよび@rds ...の回答に同意します。

簡単な例は、Volley-Marshmallow-Releaseにあります。

NetworkImageViewTest.java

// mNIV = new NetworkImageView(Robolectric.application); mNIV = new NetworkImageView(RuntimeEnvironment.application);

ボレーリンクが利用可能です https://android.googlesource.com/platform/frameworks/volley/+/marshmallow-release

あなたはアンドロイドスタジオのボレーモジュールに依存関係を追加する必要があります:

dependencies { testCompile 'junit:junit:4.12' testCompile 'org.mockito:mockito-core:1.10.19' testCompile 'org.robolectric:robolectric:3.1.2' }


1

あなたの場合、私はあなたが実際に何をテストしているのかに注意すべきだと思います。時々テスト不可能な問題に出くわすコードまたは一見テストコードのすることは、コードをリファクタリングする必要があることを示している場合があります。

API呼び出し応答の場合、API呼び出し自体をテストしたくない場合があります。任意のWebサービスから情報を送受信できることをテストする必要はないかもしれませんが、コードが予期された方法で応答を処理および処理することをテストする必要があります。

その場合、テストしようとしているコードをリファクタリングする方が良いでしょう。シンプルなものを受け入れる別のクラスに応答の解析/処理を分割し、サンプル文字列応答を注入することにより、そのクラスでStringテストを行います。

これは、多かれ少なかれのアイデア以下である単一の責任依存関係反転SDSOLID


1

わかりましたので、他の多くの人が以前にこの答えを言っていて、すでに古くなっている可能性があることを知っています

    when(mockApplication.getApplicationContext()).thenReturn(RuntimeEnvironment.application);
    when(mockApplication.getFilesDir()).thenReturn(RuntimeEnvironment.application.getFilesDir());

    sharedPref = RuntimeEnvironment.application.getSharedPreferences(KEY_MY_PREF, Context.MODE_PRIVATE);
    sut = new BundleManagerImpl(mockApplication,
            processHtmlBundle, resultListener, sharedPref);

when()部分がsut初期化後だったため、nullになりました。それはあなたの一部を助けるかもしれません。

また私は

@RunWith(CustomRobolectricTestRunner.class)
@Config(constants = BuildConfig.class)

クラスの始めに

また

 when(mockApplication.getApplicationContext()).thenReturn(RuntimeEnvironment.application.getApplicationContext()); works
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.