Android IllegalStateException 没有注册仪器!必须 运行 在注册工具下
Android IllegalStateException No instrumentation registered! Must run under a registering instrumentation
我正在努力使用 Espresso 在 Android 上进行此功能测试。我的应用程序是一个 Multdex 应用程序,所以我按照此 link 中的说明进行操作,如下所示:(https://developer.android.com/tools/building/multidex.html).
我已经像这样配置了我的 build.gradle :
apply plugin: 'com.android.application'
apply plugin: 'android-apt'
def AAVersion = '3.3.2'
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
}
}
apt {
arguments {
androidManifestFile variant.outputs[0].processResources.manifestFile
resourcePackageName 'br.com.foo'
}
}
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "br.com.foo"
minSdkVersion 15
targetSdkVersion 21
android.enforceUniquePackageName = false
multiDexEnabled true
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
testApplicationId "br.com.foo.test"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
dexOptions {
preDexLibraries = false
javaMaxHeapSize "4g"
}
packagingOptions {
exclude 'META-INF/notice.txt'
exclude 'META-INF/license.txt'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
}
}
configurations.all {
resolutionStrategy.force 'com.android.support:support-annotations:22.1.0'}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
apt "org.androidannotations:androidannotations:$AAVersion"
compile "org.androidannotations:androidannotations-api:$AAVersion"
compile 'com.github.PhilJay:MPAndroidChart:v2.1.0'
compile 'com.github.daimajia:AndroidViewAnimations:v1.1.3'
compile 'com.makeramen:roundedimageview:2.1.1'
compile 'com.github.ACRA:acra:acra-4.6.2'
compile 'com.github.rahatarmanahmed:circularprogressview:2.3.2'
compile 'com.github.jhy:jsoup:jsoup-1.8.3'
compile project(':cacscore')
compile project(':croplib')
compile project(':zxingandroid')
compile project(':paho')
compile project(':urlImageViewHelper')
compile project(':facebookSDK')
compile project(':googleDateTimePickers')
compile 'com.android.support:support-v4:22.0.0'
compile 'com.android.support:appcompat-v7:22.0.0'
compile 'com.google.android.gms:play-services:7.8.0'
compile 'com.android.support:multidex:1.0.0'
compile 'org.apache.commons:commons-lang3:3.4'
compile files('libs/httpmime-4.1.jar')
compile files('libs/jackson-all-1.9.11.jar')
compile files('libs/jaxrs-api-2.2.1.GA.jar')
compile files('libs/spring-android-core-1.0.1.RELEASE.jar')
compile files('libs/spring-android-rest-template-1.0.1.RELEASE.jar')
compile 'com.melnykov:floatingactionbutton:1.2.0'
compile files('libs/trace.jar')
testCompile 'junit:junit:4.12'
testCompile 'org.powermock:powermock-api-mockito:1.6.2'
testCompile 'org.powermock:powermock-module-junit4-rule-agent:1.6.2'
testCompile 'org.powermock:powermock-module-junit4-rule:1.6.2'
testCompile 'org.powermock:powermock-module-junit4:1.6.2'
androidTestCompile 'junit:junit:4.12'
// androidTestCompile('com.android.support.test:testing-support-lib:0.1') {
// exclude group: 'junit' // junit:junit-dep conflicts with junit:unit
// }
androidTestCompile 'com.android.support.test:runner:0.4'
// Set this dependency to use JUnit 4 rules
androidTestCompile 'com.android.support.test:rules:0.4'
// Set this dependency to build and run Espresso tests
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'
// Set this dependency to build and run UI Automator tests
// androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
androidTestCompile('com.android.support:multidex-instrumentation:1.0.1') {
exclude group: 'com.android.support', module: 'multidex'
}
}
我从 Android Studio 配置了 运行 配置文件,将 testInstrumentation运行ner classe 设置为 com.android.test.runner.MultiDexTestRunner。
当我执行命令“adb shell pm list instrumentation”时,我得到以下输出:
instrumentation:br.com.doe.test/com.android.test.runner.MultiDexTestRunner (target=br.com.doe)
instrumentation:br.com.foo.test/com.android.test.runner.MultiDexTestRunner (target=br.com.foo)
instrumentation:br.com.foo/com.android.test.runner.MultiDexTestRunner (target=br.com.foo)
但是当我尝试执行我的测试时我仍然收到这个输出:
Testing started at 17:23 ...
Installing br.com.foo
DEVICE SHELL COMMAND: pm install -r "/data/local/tmp/br.com.foo"
pkg: /data/local/tmp/br.com.foo
Success
Uploading file
local path: F:\Android\CACS\cacs\cacs\build\outputs\apk\cacs-debug-androidTest-unaligned.apk
remote path: /data/local/tmp/br.com.foo.test
Installing br.com.foo.test
DEVICE SHELL COMMAND: pm install -r "/data/local/tmp/br.com.foo.test"
pkg: /data/local/tmp/br.com.foo.test
Success
Running tests
Test running started
java.lang.IllegalStateException: No instrumentation registered! Must run under a registering instrumentation.
at android.support.test.InstrumentationRegistry.getInstrumentation(InstrumentationRegistry.java:45)
at br.com.bagger.inicio.MapaEnderecoTest.setUp(MapaEnderecoTest.java:35)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:554)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1701)
Finish
这是我正在尝试的独特测试 运行:
package br.com.doe.inicio;
import android.support.test.InstrumentationRegistry;
import android.support.test.espresso.Espresso;
import android.support.test.espresso.action.ViewActions;
import android.support.test.espresso.matcher.ViewMatchers;
import android.support.test.runner.AndroidJUnit4;
import android.test.ActivityInstrumentationTestCase2;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import br.com.foo.R;
@RunWith(AndroidJUnit4.class)
public class MapaEnderecoTest extends ActivityInstrumentationTestCase2<MapaEndereco>
{
private MapaEndereco mActivity;
public MapaEnderecoTest()
{
super(MapaEndereco.class);
}
@Override
@Before
protected void setUp() throws Exception
{
super.setUp();
injectInstrumentation(InstrumentationRegistry.getInstrumentation());
mActivity = getActivity();
}
@Test
public void testeAbertura()
{
Espresso.onView(ViewMatchers.withId(R.id.map)).perform(ViewActions.click());
}
}
错误发生在 super.setUp() 调用后的 setUp 方法上。
我已将仪器注册到 Android清单文件中:
<instrumentation
android:label="Multdex"
android:name="com.android.test.runner.MultiDexTestRunner"
android:targetPackage="br.com.foo"
android:functionalTest="true"/>
而且我遇到的问题和这里描述的不一样NullPointer Exception when using Espresso
问题出在这些 gradle 行:
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"
你需要一个 MultiDexTestRunner
,但是这个 class 是从 InstrumentationTestRunner
派生的。您的代码需要一个来自 AndroidJUnitRunner
的测试 运行ner
一个解决方案是创建一个扩展 AndroidJUnitRunner
并实现 MultiDex 代码的自定义 TestRunner
:
import android.os.Bundle;
import android.support.multidex.MultiDex;
import android.support.test.runner.AndroidJUnitRunner;
public class TestRunner extends AndroidJUnitRunner
{
@Override
public void onCreate(Bundle arguments)
{
MultiDex.install(getTargetContext());
super.onCreate(arguments);
}
}
您只需添加一个 Gradle 行来引用您的自定义 testInstrumentationRunner
。这将确保构建系统生成 运行 使用此 运行ner 进行测试所需的 AndroidManifest.xml
属性。
我遇到了类似的错误,并且一直在努力修复它。虽然接受的答案对 OP 有帮助,但它并没有解决我的问题,所以我决定在这里记录我的解决方案是很好的,希望它也能帮助其他人。
我的问题是我混合了 AndroidJUnit4
、InstrumentationRegistry
、ApplicationProvider
和 AndroidJUnitRunner
版本/包。确保它们都属于同一代。这些 类 对我来说 运行:
androidx.test.runner.AndroidJUnitRunner
androidx.test.platform.app.InstrumentationRegistry
androidx.test.ext.junit.runners.AndroidJUnit4
androidx.test.core.app.ApplicationProvider
对于这些,我需要在 build.gradle
的 dependencies
部分中添加以下内容
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
androidTestImplementation 'androidx.test:core:1.2.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test:rules:1.2.0'
当然是正确的
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
在我的defaultConfig
中build.gradle
而不是:
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
我不得不使用不同的库:
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
我正在努力使用 Espresso 在 Android 上进行此功能测试。我的应用程序是一个 Multdex 应用程序,所以我按照此 link 中的说明进行操作,如下所示:(https://developer.android.com/tools/building/multidex.html).
我已经像这样配置了我的 build.gradle :
apply plugin: 'com.android.application'
apply plugin: 'android-apt'
def AAVersion = '3.3.2'
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
}
}
apt {
arguments {
androidManifestFile variant.outputs[0].processResources.manifestFile
resourcePackageName 'br.com.foo'
}
}
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "br.com.foo"
minSdkVersion 15
targetSdkVersion 21
android.enforceUniquePackageName = false
multiDexEnabled true
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
testApplicationId "br.com.foo.test"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
dexOptions {
preDexLibraries = false
javaMaxHeapSize "4g"
}
packagingOptions {
exclude 'META-INF/notice.txt'
exclude 'META-INF/license.txt'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
}
}
configurations.all {
resolutionStrategy.force 'com.android.support:support-annotations:22.1.0'}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
apt "org.androidannotations:androidannotations:$AAVersion"
compile "org.androidannotations:androidannotations-api:$AAVersion"
compile 'com.github.PhilJay:MPAndroidChart:v2.1.0'
compile 'com.github.daimajia:AndroidViewAnimations:v1.1.3'
compile 'com.makeramen:roundedimageview:2.1.1'
compile 'com.github.ACRA:acra:acra-4.6.2'
compile 'com.github.rahatarmanahmed:circularprogressview:2.3.2'
compile 'com.github.jhy:jsoup:jsoup-1.8.3'
compile project(':cacscore')
compile project(':croplib')
compile project(':zxingandroid')
compile project(':paho')
compile project(':urlImageViewHelper')
compile project(':facebookSDK')
compile project(':googleDateTimePickers')
compile 'com.android.support:support-v4:22.0.0'
compile 'com.android.support:appcompat-v7:22.0.0'
compile 'com.google.android.gms:play-services:7.8.0'
compile 'com.android.support:multidex:1.0.0'
compile 'org.apache.commons:commons-lang3:3.4'
compile files('libs/httpmime-4.1.jar')
compile files('libs/jackson-all-1.9.11.jar')
compile files('libs/jaxrs-api-2.2.1.GA.jar')
compile files('libs/spring-android-core-1.0.1.RELEASE.jar')
compile files('libs/spring-android-rest-template-1.0.1.RELEASE.jar')
compile 'com.melnykov:floatingactionbutton:1.2.0'
compile files('libs/trace.jar')
testCompile 'junit:junit:4.12'
testCompile 'org.powermock:powermock-api-mockito:1.6.2'
testCompile 'org.powermock:powermock-module-junit4-rule-agent:1.6.2'
testCompile 'org.powermock:powermock-module-junit4-rule:1.6.2'
testCompile 'org.powermock:powermock-module-junit4:1.6.2'
androidTestCompile 'junit:junit:4.12'
// androidTestCompile('com.android.support.test:testing-support-lib:0.1') {
// exclude group: 'junit' // junit:junit-dep conflicts with junit:unit
// }
androidTestCompile 'com.android.support.test:runner:0.4'
// Set this dependency to use JUnit 4 rules
androidTestCompile 'com.android.support.test:rules:0.4'
// Set this dependency to build and run Espresso tests
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'
// Set this dependency to build and run UI Automator tests
// androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
androidTestCompile('com.android.support:multidex-instrumentation:1.0.1') {
exclude group: 'com.android.support', module: 'multidex'
}
}
我从 Android Studio 配置了 运行 配置文件,将 testInstrumentation运行ner classe 设置为 com.android.test.runner.MultiDexTestRunner。
当我执行命令“adb shell pm list instrumentation”时,我得到以下输出:
instrumentation:br.com.doe.test/com.android.test.runner.MultiDexTestRunner (target=br.com.doe)
instrumentation:br.com.foo.test/com.android.test.runner.MultiDexTestRunner (target=br.com.foo)
instrumentation:br.com.foo/com.android.test.runner.MultiDexTestRunner (target=br.com.foo)
但是当我尝试执行我的测试时我仍然收到这个输出:
Testing started at 17:23 ...
Installing br.com.foo
DEVICE SHELL COMMAND: pm install -r "/data/local/tmp/br.com.foo"
pkg: /data/local/tmp/br.com.foo
Success
Uploading file
local path: F:\Android\CACS\cacs\cacs\build\outputs\apk\cacs-debug-androidTest-unaligned.apk
remote path: /data/local/tmp/br.com.foo.test
Installing br.com.foo.test
DEVICE SHELL COMMAND: pm install -r "/data/local/tmp/br.com.foo.test"
pkg: /data/local/tmp/br.com.foo.test
Success
Running tests
Test running started
java.lang.IllegalStateException: No instrumentation registered! Must run under a registering instrumentation.
at android.support.test.InstrumentationRegistry.getInstrumentation(InstrumentationRegistry.java:45)
at br.com.bagger.inicio.MapaEnderecoTest.setUp(MapaEnderecoTest.java:35)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:554)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1701)
Finish
这是我正在尝试的独特测试 运行:
package br.com.doe.inicio;
import android.support.test.InstrumentationRegistry;
import android.support.test.espresso.Espresso;
import android.support.test.espresso.action.ViewActions;
import android.support.test.espresso.matcher.ViewMatchers;
import android.support.test.runner.AndroidJUnit4;
import android.test.ActivityInstrumentationTestCase2;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import br.com.foo.R;
@RunWith(AndroidJUnit4.class)
public class MapaEnderecoTest extends ActivityInstrumentationTestCase2<MapaEndereco>
{
private MapaEndereco mActivity;
public MapaEnderecoTest()
{
super(MapaEndereco.class);
}
@Override
@Before
protected void setUp() throws Exception
{
super.setUp();
injectInstrumentation(InstrumentationRegistry.getInstrumentation());
mActivity = getActivity();
}
@Test
public void testeAbertura()
{
Espresso.onView(ViewMatchers.withId(R.id.map)).perform(ViewActions.click());
}
}
错误发生在 super.setUp() 调用后的 setUp 方法上。
我已将仪器注册到 Android清单文件中:
<instrumentation
android:label="Multdex"
android:name="com.android.test.runner.MultiDexTestRunner"
android:targetPackage="br.com.foo"
android:functionalTest="true"/>
而且我遇到的问题和这里描述的不一样NullPointer Exception when using Espresso
问题出在这些 gradle 行:
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"
你需要一个 MultiDexTestRunner
,但是这个 class 是从 InstrumentationTestRunner
派生的。您的代码需要一个来自 AndroidJUnitRunner
一个解决方案是创建一个扩展 AndroidJUnitRunner
并实现 MultiDex 代码的自定义 TestRunner
:
import android.os.Bundle;
import android.support.multidex.MultiDex;
import android.support.test.runner.AndroidJUnitRunner;
public class TestRunner extends AndroidJUnitRunner
{
@Override
public void onCreate(Bundle arguments)
{
MultiDex.install(getTargetContext());
super.onCreate(arguments);
}
}
您只需添加一个 Gradle 行来引用您的自定义 testInstrumentationRunner
。这将确保构建系统生成 运行 使用此 运行ner 进行测试所需的 AndroidManifest.xml
属性。
我遇到了类似的错误,并且一直在努力修复它。虽然接受的答案对 OP 有帮助,但它并没有解决我的问题,所以我决定在这里记录我的解决方案是很好的,希望它也能帮助其他人。
我的问题是我混合了 AndroidJUnit4
、InstrumentationRegistry
、ApplicationProvider
和 AndroidJUnitRunner
版本/包。确保它们都属于同一代。这些 类 对我来说 运行:
androidx.test.runner.AndroidJUnitRunner
androidx.test.platform.app.InstrumentationRegistry
androidx.test.ext.junit.runners.AndroidJUnit4
androidx.test.core.app.ApplicationProvider
对于这些,我需要在 build.gradle
的dependencies
部分中添加以下内容
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
androidTestImplementation 'androidx.test:core:1.2.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test:rules:1.2.0'
当然是正确的
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
在我的defaultConfig
中build.gradle
而不是:
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
我不得不使用不同的库:
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'