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つのスクリーンショットは次のとおりです。
これらのデバイスに展開せずに動作します。 テストを_/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
}
_
InstrumentationTestCaseTest
とContext
および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));
}
}
_
AndroidTestCase
とContext
および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).
または類似のものを使用することだと思います。
テストリソース:
_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
テストリソース:
_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
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
Android Testing Support Library を使用すると、次のことができます
InstrumentationRegistry.getContext()
でテストapkコンテキストを取得InstrumentationRegistry.getTargetContext()
でアプリのapkコンテキストを取得InstrumentationRegistry.getInstrumentation()
でインストルメンテーションを取得テストサポートライブラリをプロジェクトに追加する方法については、リンクされたページの下部を参照してください。
これが、(ユニット)インストルメンテーションテストをセットアップする最近の方法です。
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();
}
}
@taynguyenの回答を使用してSQLiteを呼び出しようとするとエラーが発生しました。
InstrumentationRegistry.getContext()
私が使用した:
InstrumentationRegistry.getTargetContext()
Instrumentationコンテキストの代わりにターゲットアプリケーションコンテキストを取得するため。
getInstrumentation().getContext()
は非推奨になりました。これを使用する必要がありますInstrumentationRegistry.getInstrumentation().getTargetContext()
詳細はこちらをご覧ください androidx.test.InstrumentationRegistryは非推奨です
Context
は、Context
やActivity
クラスなど、Application
を拡張するものを参照する必要があります。
Context context = new Activity();
別の方法は、Robolectric.Application
を使用することです。