14

该页面http://developer.android.com/tools/building/multidex.html#testing 建议

   dependencies {
     compile 'com.android.support:multidex:1.0.1'
     androidTestCompile 'com.android.support:multidex-instrumentation:1.0.1'
   }
   android {
     defaultConfig {
        multiDexEnabled true
        testInstrumentationRunner "android.support.multidex.MultiDexTestRunner"
     }
  }

但是在运行测试时会产生 ClassNotFoundException。

API 文档和 dexdump 显示有 com.android.test.runner.MultiDexTestRunner。

因此,如果我不相信文档并指定

   dependencies {
     compile 'com.android.support:multidex:1.0.1'
     androidTestCompile 'com.android.support:multidex-instrumentation:1.0.1'
   }
  android {
     defaultConfig {
        multiDexEnabled true
        testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"
     }
   }

然后我得到

com/company/myapp/MyApp; had used a different Landroid/support/multidex/MultiDexApplication; during pre-verification 
...
IllegalAccessExceptionIllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation

我怀疑文档页面是错误的,正确的路径是 com.android.test.runner.MultiDexTestRunner ...另外我还有其他问题。

请注意,multidex 应用程序工作正常。不知何故,第二个 MultiDexApplication 包含在测试 apk 中。

问题:
MultiDexTestRunner 的正确路径是什么?为什么我在测试 apk 中获得了第二个 MultiDexApplication?

4

3 回答 3

6

更新:这是修复。这是一种常见的模式,当您看到此类错误消息时had used a different L<package>; during pre-verification,您需要在运行测试时排除该包。

build.gradle

android {
    // ...
    defaultConfig {
        // ...
        multiDexEnabled true
        testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"
    }
}

dependencies {
    // ...
    // Need to exclude this when running test
    androidTestCompile('com.android.support:multidex-instrumentation:1.0.1') {
        exclude group: 'com.android.support', module: 'multidex'
    }
}

Application.java

public class Application extends android.app.Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}
于 2015-02-20T05:08:11.270 回答
2

注意:当您为 multidex 应用程序编写检测测试时,如果您使用 MonitoringInstrumentation(或 AndroidJUnitRunner)检测,则无需额外配置。

因此,不要使用已弃用的 MultiDexTestRunner;改用 AndroidJUnitRunner。(这适用于multidex支持库v1.0.2+)

android {
    // ...
    defaultConfig {
        // ...
        multiDexEnabled true
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
}

仅当您具有测试运行器引导程序的自定义实现时:

public void onCreate(Bundle arguments) {
  MultiDex.install(getTargetContext());
  super.onCreate(arguments);
  ...
}

见:https ://developer.android.com/studio/build/multidex.html#testing

于 2017-08-09T16:03:09.383 回答
0

原始问题中描述的确切问题可能与旧版本有关。我在这里添加我的经验,因为这是谷歌在研究问题时的第一个命中。

使用最新版本的工具和 android 插件,您不需要其他任何东西build.gradle

...
android {
    ...
    defaultConfig {
        ...
        testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"
    }
}

(我有com.android.tools.build:gradle:1.5.0

编辑:正如@igor-ganapolsky 指出的那样,MultiDexTestRunner 已被弃用。我无法再访问出现此问题的来源,但我怀疑当项目的整个测试设置需要大修时,MultiDexTestRunner 会出现问题。

文档指向新的测试支持库作为解决方案

于 2016-01-04T11:50:42.430 回答