IllegalAccessError:预验证类中的类ref解析为Android单元测试中的意外实现

问题描述 投票:0回答:3

我正在努力在Android Studio中进行单元测试以处理一些现有代码。我是kepp得到IllegalAccessError,似乎无法找到它的解决方案。非常需要任何帮助。

我使用的是Android Studio 1.1.0,gradle 1.1.0和Espresso 2.0。

堆栈跟踪:

java.lang.NoClassDefFoundError: com/hoganas/eclino/activities/BikeActivity
at com.hoganas.eclino.activities.ScanActivity$1.onItemClick(ScanActivity.java:49)
at android.widget.AdapterView.performItemClick(AdapterView.java:308)
at android.widget.AbsListView.performItemClick(AbsListView.java:1478)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3480)
at android.widget.AbsListView$3.run(AbsListView.java:4823)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.support.test.espresso.base.UiControllerImpl.loopUntil(UiControllerImpl.java:461)
at android.support.test.espresso.base.UiControllerImpl.loopUntil(UiControllerImpl.java:402)
at android.support.test.espresso.base.UiControllerImpl.loopMainThreadForAtLeast(UiControllerImpl.java:387)
at android.support.test.espresso.action.Tap$1.sendTap(Tap.java:44)
at android.support.test.espresso.action.GeneralClickAction.perform(GeneralClickAction.java:98)
at android.support.test.espresso.ViewInteraction$1.run(ViewInteraction.java:144)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5356)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
at dalvik.system.DexFile.defineClassNative(Native Method)
at dalvik.system.DexFile.defineClass(DexFile.java:222)
at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:215)
at dalvik.system.DexPathList.findClass(DexPathList.java:322)
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:65)
at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
... 24 more

这是测试用例,它似乎在执行调用时失败(click())。

public class BluetoothConnectionTest extends ActivityInstrumentationTestCase2<ScanActivity> {

public BluetoothConnectionTest() {
    super(ScanActivity.class);
}

@Override
public void setUp() throws Exception {
    super.setUp();
    getActivity();
}

private final long SLEEP = 1000;
private final long SLEEP_LONG = 2000;
private final long SLEEP_LONGER = SLEEP_LONG * 2;

public void testScanActivity() {
    try {
        Espresso.onView(withId(R.id.lvScanResult));
        ViewInteraction vi = Espresso.onData(is(instanceOf(LeDeviceListAdapter.BluetoothItem.class)))
                .inAdapterView(withId(R.id.lvScanResult)).onChildView(withId(R.id.tvName)).check(matches(withText("Bike 2")));
        Thread.sleep(SLEEP_LONG);
        vi.perform(click());
        Espresso.onView(withId(R.id.tvSpeedUnit)).check(matches(withText("km/h")));
        Thread.sleep(SLEEP_LONGER);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

...是的我知道我不应该在测试中使用Thread.sleep但这是另一个问题......我也在努力让CountingIdlingResource在这里工作......

这是gradle文件:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"
    defaultConfig {
        applicationId 'com.hoganas.eclino'
        minSdkVersion 18
        targetSdkVersion 21
        versionCode 2
        versionName "2.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            zipAlignEnabled true
        }
        debug {
            zipAlignEnabled true
        }
    }
    productFlavors {
    }
    packagingOptions {
        exclude('LICENSE.txt')
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
    provided 'com.google.guava:guava:18.0'
    compile 'com.android.support:support-v13:21.0.3'

    androidTestProvided 'com.google.guava:guava:18.0'
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0'
    androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.0'
    androidTestCompile 'com.android.support.test.espresso:espresso-idling-resource:2.0'
    androidTestCompile 'com.android.support.test:testing-support-lib:0.1'
}

堆栈跟踪还指出,当在被测活动中访问BikeActivity类时,IllegalStateError会导致NoClassDefFoundError:

            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
            final BluetoothDevice device = mLeDeviceListAdapter.getDevice(position);
            if (device == null) return;
            final Intent intent = new Intent(getApplicationContext(), BikeActivity.class);
            intent.putExtra(BikeActivity.EXTRAS_DEVICE_NAME, device.getName());
            intent.putExtra(BikeActivity.EXTRAS_DEVICE_ADDRESS, device.getAddress());
            if (mScanning) {
                mBluetoothAdapter.stopLeScan(mLeScanCallback);
                mScanning = false;
            }
            startActivity(intent);
        }

编辑:现在我将gradle依赖项更改为:

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

androidTestCompile ('com.android.support.test.espresso:espresso-core:2.0') {
    exclude group: "javax.inject"
    exclude group: "com.google.guava"
}
androidTestCompile ('com.android.support.test:testing-support-lib:0.1') {
    exclude group: "javax.inject"
    exclude group: "com.google.guava"
}

}

当我运行测试时,我得到以下错误:

java.lang.NoClassDefFoundError: 

android.support.test.espresso.base.BaseLayerModule$$ModuleAdapter$ProvideLifecycleMonitorProvidesAdapter
at android.support.test.espresso.base.BaseLayerModule$$ModuleAdapter.getBindings(BaseLayerModule$$ModuleAdapter.java:36)
at android.support.test.espresso.base.BaseLayerModule$$ModuleAdapter.getBindings(BaseLayerModule$$ModuleAdapter.java:16)
at com.android.support.test.deps.dagger.ObjectGraph$DaggerObjectGraph.makeGraph(ObjectGraph.java:185)
at com.android.support.test.deps.dagger.ObjectGraph$DaggerObjectGraph.access$000(ObjectGraph.java:138)
at com.android.support.test.deps.dagger.ObjectGraph.create(ObjectGraph.java:129)
at android.support.test.espresso.GraphHolder.graph(GraphHolder.java:48)
at android.support.test.espresso.Espresso.espressoGraph(Espresso.java:55)
at android.support.test.espresso.Espresso.onView(Espresso.java:70)
at android.support.test.espresso.DataInteraction.load(DataInteraction.java:151)
at android.support.test.espresso.DataInteraction.check(DataInteraction.java:141)
at com.hoganas.eclino.BluetoothConnectionTest.testScanActivity(BluetoothConnectionTest.java:40)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214)
at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199)
at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:192)
at junit.framework.TestCase.runBare(TestCase.java:134)
at junit.framework.TestResult$1.protect(TestResult.java:115)
at junit.framework.TestResult.runProtected(TestResult.java:133)
at android.support.test.internal.runner.junit3.DelegatingTestResult.runProtected(DelegatingTestResult.java:90)
at junit.framework.TestResult.run(TestResult.java:118)
at android.support.test.internal.runner.junit3.AndroidTestResult.run(AndroidTestResult.java:49)
at junit.framework.TestCase.run(TestCase.java:124)
at android.support.test.internal.runner.junit3.NonLeakyTestSuite$NonLeakyTest.run(NonLeakyTestSuite.java:63)
at junit.framework.TestSuite.runTest(TestSuite.java:243)
at junit.framework.TestSuite.run(TestSuite.java:238)
at android.support.test.internal.runner.junit3.DelegatingTestSuite.run(DelegatingTestSuite.java:103)
at android.support.test.internal.runner.junit3.AndroidTestSuite.run(AndroidTestSuite.java:63)
at android.support.test.internal.runner.junit3.JUnit38ClassRunner.run(JUnit38ClassRunner.java:90)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:24)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
at org.junit.runner.JUnitCore.run(JUnitCore.java:136)
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:270)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1741)

有什么想法怎么办?

编辑2:我使用的是AndroidJUnitRunner,而不是GoogleInstrumentationTestRunner。 Espresso 2.0的文档告诉您使用AndroidJUnitRunner,尽管这里有很多人提出了GITR。我试图切换到GITR,但甚至没有得到测试运行。

java android unit-testing android-gradle android-espresso
3个回答
1
投票

在你的build.gradle中dependencies

androidTestCompile ("com.android.support.test.espresso:espresso-contrib:2.2.1")  {
    exclude group: 'com.android.support', module: 'support-v4'
}

1
投票

您可以尝试添加以下排除:

configurations {
    androidTestCompile.exclude group: 'com.android.support', module: 'support-v4'
} 

在我的案例中,这解决了java.lang.NoClassDefFoundError


0
投票

你必须排除javax.inject

androidTestCompile('com.android.support.test.espresso:espresso-core:2.0') {
   exclude group: "javax.inject"
}

请注意,您可能必须为所有espresso依赖项执行此操作。

看到:

bug report

Related question 1

Related question 2

© www.soinside.com 2019 - 2024. All rights reserved.