実際には、API呼び出しの応答を取得する必要がありますContext
。そのために必要でした。
実際には、API呼び出しの応答を取得する必要がありますContext
。そのために必要でした。
回答:
更新。
バージョン1.xおよび2.xに使用するだけです。
Robolectric.application;
そしてバージョン3.xの場合:
RuntimeEnvironment.application;
そして、バージョン4.xの場合:
build.gradle
ファイルに追加:
testImplementation 'androidx.test:core:1.0.0'
コンテキストを取得するには:
ApplicationProvider.getApplicationContext()
RuntimeEnvironment.application
、静的コード(で注釈が付けられたメソッドなど@BeforeClass
)で使用しないでくださいnull
。
追加
testImplementation "androidx.test:core-ktx:${deps.testrunner}"
そして使用:
private val app = ApplicationProvider.getApplicationContext()
2019年現在の最新のRobolectric 4.3について `
ShadowApplication.getInstance()
`と
Roboletric.application
両方とも低価格です。だから私は使っています
Context context = RuntimeEnvironment.systemContext;
コンテキストを取得します。
アプリケーションコンテキストを取得するには、次の操作を行う必要があります。
7月21日のリリース4.0-alpha-3以降、それらは削除されました ShadowApplication.getApplicationContext()
。でRuntimeEnvironment.application.getApplicationContext()
注釈が付けられたすべてのテストに固執し@RunWith(RobolectricTestRunner::class)
ます。
余談ですが、現在のガイドには、次を使用して文字列リソースを取得する例があります。
final Context context = RuntimeEnvironment.application;
(注のJavadocことRuntimeEnvironment
とはShadowApplication
、現在非アルファ3.xの放出を反映しています。)
場合によっては、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());
}
}
使用する方が安全であるRobolectric.getShadowApplication()
使用するのではなくRobolectric.application
、直接。
Robolectric.application
@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'
}
あなたの場合、私はあなたが実際に何をテストしているのかに注意すべきだと思います。時々テスト不可能な問題に出くわすコードまたは一見テストコードのすることは、コードをリファクタリングする必要があることを示している場合があります。
API呼び出し応答の場合、API呼び出し自体をテストしたくない場合があります。任意のWebサービスから情報を送受信できることをテストする必要はないかもしれませんが、コードが予期された方法で応答を処理および処理することをテストする必要があります。
その場合、テストしようとしているコードをリファクタリングする方が良いでしょう。シンプルなものを受け入れる別のクラスに応答の解析/処理を分割し、サンプル文字列応答を注入することにより、そのクラスでString
テストを行います。
これは、多かれ少なかれのアイデア以下である単一の責任と依存関係反転(SとDでSOLID)
わかりましたので、他の多くの人が以前にこの答えを言っていて、すでに古くなっている可能性があることを知っています
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