web-dev-qa-db-ja.com

Android junitテストケースでテストプロジェクトのコンテキストを取得

テストプロジェクト in Android junitテストケース(AndroidTestCaseを拡張))のコンテキストを取得する方法を知っている人はいますか。

注:このテストは計装テストではありません。

注2:テストする実際のアプリケーションのコンテキストではなく、テストプロジェクトのコンテキストが必要です。

テストプロジェクトのアセットからいくつかのファイルを読み込むためにこれが必要です。

96
peceps

Android Testing Support Library(現在androidx.test:runner:1.1.1)。 Kotlinは例を更新しました:

class ExampleInstrumentedTest {

    lateinit var instrumentationContext: Context

    @Before
    fun setup() {
        instrumentationContext = InstrumentationRegistry.getInstrumentation().context
    }

    @Test
    fun someTest() {
        TODO()
    }
}

アプリコンテキストも実行する場合:

InstrumentationRegistry.getInstrumentation().targetContext

完全な実行例: https://github.com/fada21/AndroidTestContextExample

ここを見てください: getTargetContext()とgetContext(InstrumentationRegistry)の違い​​は何ですか?

113
fada21

いくつかの調査の後、唯一の有効な解決策は、すでに指摘されているyorkwのようです。 InstrumentationTestCaseを拡張する必要があります。その後、getInstrumentation()。getContext()を使用してテストアプリケーションのコンテキストにアクセスできます。上記の提案を使用した簡単なコードスニペットを次に示します。

public class PrintoutPullParserTest extends InstrumentationTestCase {

    public void testParsing() throws Exception {
        PrintoutPullParser parser = new PrintoutPullParser();
        parser.parse(getInstrumentation().getContext().getResources().getXml(R.xml.printer_configuration));
    }
}
37
AgentKnopf

AndroidTestCaseソースコード で読むことができるように、getTestContext()メソッドは隠されています。

_/**
 * @hide
 */
public Context getTestContext() {
    return mTestContext;
}
_

リフレクションを使用して_@hide_注釈をバイパスできます。

AndroidTestCaseに次のメソッドを追加するだけです:

_/**
 * @return The {@link Context} of the test project.
 */
private Context getTestContext()
{
    try
    {
        Method getTestContext = ServiceTestCase.class.getMethod("getTestContext");
        return (Context) getTestContext.invoke(this);
    }
    catch (final Exception exception)
    {
        exception.printStackTrace();
        return null;
    }
}
_

その後、getTestContext()をいつでも呼び出します。 :)

25

更新:AndroidTestCaseこのクラスはAPIレベル24で廃止されました。代わりにInstrumentationRegistryを使用してください。新しいテストは、Android Testing Support Library。 発表へのリンク

TestCaseではなくAndroidTestCaseから拡張する必要があります。

AndroidTestCaseクラスの概要
アクティビティコンテキストに依存するリソースまたはその他のものにアクセスする必要がある場合は、これを拡張します。

AndroidTestCase-Android Developers

4
eslamb

KotlinとMockitoを使用してコンテキストを取得する場合は、次の方法で実行できます。

val context = mock(Context::class.Java)

私はあなたの助けを願っています

2

これは、コンテキストを取得する正しい方法です。他のメソッドはすでに非推奨です

import androidx.test.platform.app.InstrumentationRegistry

InstrumentationRegistry.getInstrumentation().context
1
tomrozb
import androidx.test.core.app.ApplicationProvider;

    private Context context = ApplicationProvider.getApplicationContext();
0
eoinzy

他の答えは時代遅れです。現在、AndroidTestCaseを拡張するたびに、使用できるmContext Contextオブジェクトがあります。

0
Yoni Keren

プロジェクトのリソースへのアクセスだけが必要な場合は、getActivity()ActivityInstrumentationTestCase2 class のメソッドを使用できます。

 //...
 private YourActivityClass mActivity;
 @Override
 protected void setUp() throws Exception {
 //...
     mActivity = getActivity();

 }
 //...
 public void testAccessToResources() {
     String[] valueList;
     valueList = 
         mActivity.getResources().getStringArray(
                 com.yourporject.R.array.test_choices);
 }
0
0x8BADF00D

JVMでのAndroid単体テストにRobolectricを使用できます。

Robolectricは、Android API。を使用しながら、単体テストを作成してデスクトップJVMで実行できるようにするフレームワークです。

Robolectricは、Android.jarファイルのJVM準拠バージョンを提供します。 Robolectricは、ビューのインフレーション、リソースの読み込み、およびAndroidデバイスのネイティブCコードで実装されている他の多くのものを処理します。

dependencies {
    ...
    // Robolectric
    testCompile "org.robolectric:robolectric:3.3.2"
}
  1. テストはsrc/testディレクトリに保存する必要があります。
  2. Robolectricテストを含むクラスには、@RunWith(RobolectricTestRunner.classテストランナーの注釈を付ける必要があります。
  3. また、@ Config()を使用してBuildConfig.classクラスを指す必要があります。

例えば

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

public class WelcomeActivityTest
{
    private WelcomeActivity activity;

    @Before
    public void setUp() throws Exception
    {
        activity = Robolectric.buildActivity( WelcomeActivity.class )
                              .create()
                              .resume()
                              .get();
    }

    @Test
    public void shouldNotBeNull() throws Exception
    {
        assertNotNull( activity );
    }
}

続きを読む こちら

0
yoAlex5