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


107

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

注:テストは計測テストではありません。

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

これは、テストプロジェクトのアセットからいくつかのファイルをロードするために必要です。


なぜInstrumentationTestCaseを使用できないのですか?
ヨーク12/11/22

1
UIではなくサービスをテストしているためです。
peceps 2011

1
ここで見つけるより良い答えがあります:[1] [1] [代わりに、JUnitテストのAndroidTestCase使用]:stackoverflow.com/questions/3170706/...
ハイメ・ボテロ

回答:


135

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)の違い​​は何ですか?


最後に、InstrumentationTestでJUnit4を使用する方法についての回答。何時間もの検索の後。Android開発が大好きです。
Fabian Zeindl 2016年

1
いいね!tx(クラスメンバーにタイプミスがあることに注意してください)
Greg

1
これが機能するためにgradleファイルにどの依存関係を追加する必要があるかについて誰かが助けてもらえますか?
グレッグ

1
compile "com.android.support.test:runner:1.0.1"グラドルに追加することを忘れないでください
egorikem

2
非推奨ですInstrumentationRegistry.getInstrumentation().context。代わりに使用してください。
Allan Veloso

37

いくつかの調査の後、唯一の実用的な解決策は、すでに指摘されているもののようです。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));
    }
}

7
はい、でもAndroidが単純なJUnitテストでテストプロジェクトコンテキストへのアクセスを提供しないのはばかげているようです。コンテキストはAndroidTestCase.mTestContextにありますが、プライベートです。理由はわかりません。
peceps 2012年

@peceps Full Ack-しかし、それはまさにそれであり、私もそれを好きではありません;)
AgentKnopf

25

あなたが読むことができるよう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()いつでもお電話ください。:)


2
この方法のいずれかによってAndroidTestCaseのコンテキストを使用して、私と私の負荷資産のために完璧に働いた、またはActivityInstrumentationTestCase2.getInstrumentation().getContext()その後、getResources().getAssets()
アンドリュー・マッケンジー

彼らがなぜそれを隠したのかについて推測できますか?この手法を使用する場合、今後のリリースでメソッドを削除できますか(テストコードを壊します)?
アンドリューシェパード

1
私が得るjava.lang.NoSuchMethodException: android.test.ServiceTestCase.getTestContext()
kurdtpage

4

更新: AndroidTestCaseこのクラスはAPIレベル24で廃止されましたInstrumentationRegistry。代わりに使用してください。新しいテストは、Android Testing Support Libraryを使用して作成する必要があります。お知らせへのリンク

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

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

AndroidTestCase-Android開発者


4

KotlinとMockitoでコンテキストを取得する場合は、次の方法で行うことができます。

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

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


コンテキストでnullになりますか?
Deven

テストクラスに@RunWith(MockitoJUnitRunner :: class)で注釈を付けることを忘れないでください
USMAN osman

2

これは、コンテキストを取得する正しい方法です。他のメソッドはすでに廃止されています

import androidx.test.platform.app.InstrumentationRegistry

InstrumentationRegistry.getInstrumentation().context

2
import androidx.test.core.app.ApplicationProvider;

    private Context context = ApplicationProvider.getApplicationContext();

1

自動テストの作成中にこれらの問題が発生した場合は、次のようにする必要があります。

    Context instrumentationContext;

    @Before
    public void method() {

        instrumentationContext = InstrumentationRegistry.getInstrumentation().getContext();

        MultiDex.install(instrumentationContext);
    }

0

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

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