web-dev-qa-db-ja.com

Android Studioの単体テスト機能でAndroidTestCaseまたはInstrumentationTestCaseのコンテキストを取得する

Android Studio 1.1.0の新しい単体テストサポート機能を使用して、いくつかの古いテストを実行しました。gradlewtestDebugを実行すると、テストは実行されますが、コンテキストを必要とするすべてのテストはgetContext(AndroidTestCase)/ getInstrumentation.getContext()(InstrumentationTestCase)は両方ともnullを返します。

どうすれば解決できますか?

ここに私が試した2つのバリエーションがあります。

import Android.content.Context;
import Android.test.InstrumentationTestCase;

public class TestTest extends InstrumentationTestCase {

    Context context;

    public void setUp() throws Exception {
        super.setUp();

        context = getInstrumentation().getContext();

        assertNotNull(context);

    }

    public void testSomething() {

        assertEquals(false, true);
    }  

}

そして

import Android.content.Context;
import Android.test.AndroidTestCase;

public class TestTest extends AndroidTestCase {

    Context context;

    public void setUp() throws Exception {
        super.setUp();

        context = getContext();

        assertNotNull(context);

    }

    public void testSomething() {

        assertEquals(false, true);
    }

}

これは私のモジュールのbuild.gradle

apply plugin: 'com.Android.application'

Android {
    compileSdkVersion 22
    buildToolsVersion "22.0.0"

    testOptions {
        unitTests.returnDefaultValues = true
    }

    defaultConfig {
        applicationId "com.example.test.penistest"
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.Android.support:appcompat-v7:22.0.0'
    testCompile 'junit:junit:4.12'
}

そして、ここでbuild.gradleプロジェクトの場合:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.Android.tools.build:gradle:1.1.3'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

編集:AS 1.1.0にアップグレードする前に私のテストはすべて機能し、デバイス/エミュレータで実行しました。

編集:

失敗したInstrumentationTestCaseおよびAndroidTestCaseの2つのスクリーンショットは次のとおりです。

enter image description here

enter image description here

22
asco

更新-インストルメンテーションテストの作成にはEspressoを使用してください

新しい例:

これらのデバイスに展開せずに動作しますテストを_/src/main/test/_フォルダに入れます。

ここに新しい例があります。私はあなたの例をとり、自分の一時的なテストプロジェクトでテストしました。コマンドラインを介してテストを実行しました:_./gradlew clean test_。詳細はこちらをご覧ください: https://sites.google.com/a/Android.com/tools/tech-docs/unit-testing-support

トップ_build.gradle_:

_// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.Android.tools.build:gradle:1.1.3'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}
_

アプリ_build.gradle_:

_apply plugin: 'com.Android.application'

Android {
    compileSdkVersion 22
    buildToolsVersion "22.0.0"

    defaultConfig {
        applicationId "com.test"
        minSdkVersion 9
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }

    testOptions { // <-- You need this
        unitTests {
            returnDefaultValues = true
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.Android.support:appcompat-v7:22.0.0'

    testCompile 'junit:junit:4.12' // <-- You need this
}
_

基本テスト:

InstrumentationTestCaseTestContextおよびAssertionsをテストします。

_import Android.content.Context;
import Android.test.InstrumentationTestCase;
import Android.test.mock.MockContext;

public class InstrumentationTestCaseTest extends InstrumentationTestCase {

    Context context;

    public void setUp() throws Exception {
        super.setUp();

        context = new MockContext();

        assertNotNull(context);

    }

    public void testSomething() {

        assertEquals(false, true);
    }

}
_

ActivityTestCaseを使用して、Resourcesをテストします。

_import Android.content.Context;
import Android.content.res.Resources;
import Android.test.ActivityTestCase;

public class ActivityTestCaseTest extends ActivityTestCase {

    public void testFoo() {

        Context testContext = getInstrumentation().getContext();
        Resources testRes = testContext.getResources();

        assertNotNull(testRes);
        assertNotNull(testRes.getString(R.string.app_name));
    }
}
_

AndroidTestCaseContextおよびAssertionsをテストします。

_import Android.content.Context;
import Android.test.AndroidTestCase;
import Android.test.mock.MockContext;

public class AndroidTestCaseTest extends AndroidTestCase {

    Context context;

    public void setUp() throws Exception {
        super.setUp();

        context = new MockContext();

        setContext(context);

        assertNotNull(context);

    }

    // Fake failed test
    public void testSomething()  {
        assertEquals(false, true);
    }
}
_

古い例のグーグル:

このエラーについて多くのグーグルを行った後、あなたの賭けはあなたのリソースをテストするためにgetInstrumentation().getContext().getResources().openRawResource(R.raw.your_res).または類似のものを使用することだと思います。

InstrumentationTestCaseの使用:

テストリソース:

_public class PrintoutPullParserTest extends InstrumentationTestCase {

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

ソース: https://stackoverflow.com/a/8870318/950427 および https://stackoverflow.com/a/16763196/950427

ActivityTestCaseの使用:

テストリソース:

_public class Test extends ActivityTestCase {

   public void testFoo() {  

      // .. test project environment
      Context testContext = getInstrumentation().getContext();
      Resources testRes = testContext.getResources();
      InputStream ts = testRes.openRawResource(R.raw.your_res);

      assertNotNull(testRes);
   }    
}
_

ソース: https://stackoverflow.com/a/9820390/950427

AndroidTestCaseの使用:

Contextを取得する(簡単なハック):

_private Context getTestContext() {
    try {
        Method getTestContext = ServiceTestCase.class.getMethod("getTestContext");
        return (Context) getTestContext.invoke(this);
    } catch (final Exception exception) {
        exception.printStackTrace();
        return null;
    }
}
_

ソース: https://stackoverflow.com/a/14232913/950427

しかし、AndroidTestCaseのソースコードを見ると、Contextを自分で設定する必要があるように見えます。

ソース: http://alvinalexander.com/Java/jwarehouse/Android/core/Java/Android/test/AndroidTestCase.Java.shtml

43
Jared Burrows

Android Testing Support Library を使用すると、次のことができます

  • InstrumentationRegistry.getContext()でテストapkコンテキストを取得
  • InstrumentationRegistry.getTargetContext()でアプリのapkコンテキストを取得
  • InstrumentationRegistry.getInstrumentation()でインストルメンテーションを取得

テストサポートライブラリをプロジェクトに追加する方法については、リンクされたページの下部を参照してください。

17
taynguyen

これが、(ユニット)インストルメンテーションテストをセットアップする最近の方法です。

セットアップ

build.gradleに以下を追加します:

testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"

および次の依存関係:

// Instrumentation tests
androidTestImplementation "com.Android.support.test:runner:$supportTestRunnerVersion"
// To use assertThat syntax
androidTestImplementation "org.assertj:assertj-core:$assertJVersion"

サンプルクラス

public class Example {

    public Object doSomething() {
        // Context is used here
    }

}

テスト例

import Android.content.Context;
import Android.support.test.InstrumentationRegistry;
import Android.support.test.runner.AndroidJUnit4;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import static org.assertj.core.api.Assertions.assertThat;

@RunWith(AndroidJUnit4.class)
public class ExampleTest {

    private Context context;

    @Before
    public void setUp() {
        // In case you need the context in your test
        context = InstrumentationRegistry.getTargetContext();
    }

    @Test
    public void doSomething() {
        Example example = new Example();
        assertThat(example.doSomething()).isNotNull();
    }

}

ドキュメンテーション

11
JJD

@taynguyenの回答を使用してSQLiteを呼び出しようとするとエラーが発生しました。

InstrumentationRegistry.getContext()

私が使用した:

InstrumentationRegistry.getTargetContext()

Instrumentationコンテキストの代わりにターゲットアプリケーションコンテキストを取得するため。

4
Dev D

getInstrumentation().getContext()は非推奨になりました。これを使用する必要がありますInstrumentationRegistry.getInstrumentation().getTargetContext()詳細はこちらをご覧ください androidx.test.InstrumentationRegistryは非推奨です

1
ilatyphi95

Contextは、ContextActivityクラスなど、Applicationを拡張するものを参照する必要があります。

Context context = new Activity(); 

別の方法は、Robolectric.Applicationを使用することです。

1
TTransmit