web-dev-qa-db-ja.com

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

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

101
user1667968

更新

バージョン1.xおよび2.xに使用します。

Robolectric.application;

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

RuntimeEnvironment.application;
199
Eugen Martynov

使用できます

RuntimeEnvironment.application
25
rds

これを使って:

Robolectric.application
18
Xian

追加

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

そして使用:

private val app = ApplicationProvider.getApplicationContext()
14
John

アプリケーションコンテキストを取得するには、以下を実行する必要があります。

  1. @RunWith(RobolectricTestRunner.class)に注釈を付けます
  2. RuntimeEnvironment.application.getApplicationContext()
5
user1390616

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

ShadowApplication.getInstance()

`および

Roboletric.application

両方とも廃止されました。だから私は使用しています

Context context = RuntimeEnvironment.systemContext;

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

3
The_Martian

リリース4.0-alpha- の7月21日、 削除ShadowApplication.getApplicationContext()RuntimeEnvironment.application.getApplicationContext()アノテーションが付けられたテストには、 @RunWith(RobolectricTestRunner::class) を使用します。

余談ですが、彼らの current guide には以下を使用して文字列リソースを取得する例があります:

final Context context = RuntimeEnvironment.application;

RuntimeEnvironment および ShadowApplication のjavadocは現在、非アルファ3.xリリースを反映していることに注意してください。)

2
qix

これはRobolectric 3.5.1で動作します:ShadowApplication.getInstance().applicationContext

2
Farrukh Najmi

@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

Android studio asのvolleyモジュールに依存関係を追加する必要があります。

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

1
Bhuro

わかりましたので、私は他の多くの人が以前にこの答えを言っていて、すでに時代遅れかもしれないことを知っています

    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
1
Karoly

あなたの場合、私はあなたが実際にテストしているものに注意する必要があると思います。 ntestable codeまたは一見テスト不可能なコードの問題に遭遇することは、コードをリファクタリングする必要があることを示す兆候です。

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

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

これは多かれ少なかれ単一の責任依存関係の逆転[〜#〜] s [〜#〜]のアイデアに従っています。 および[〜#〜] d [〜#〜]in [〜#〜] solid [〜#〜]

1
grego

_Robolectric.application_を直接使用する代わりに、Robolectric.getShadowApplication()を使用する方が安全です。

1
drspaceboo

最初に以下を_build.gradle_に追加します。

_testImplementation 'androidx.test:core:1.2.0'_

次に使用します:

ApplicationProvider.getApplicationContext() as Application

1
dougie