Android Espresso在使用Multidex时无法工作,显示“未找到测试”

20

当我需要支持 multidex 时,我的 Espresso 测试就无法运行。

在我的 build.gradle 文件中,我有以下代码:

minSdkVersion 14
targetSdkVersion 23
multiDexEnabled = true

testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"


androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'
androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.2.1'
androidTestCompile 'com.android.support.test:runner:0.4.1'
androidTestCompile 'com.android.support.test:rules:0.4.1'

dexOptions {
        jumboMode true
        javaMaxHeapSize "4g"
        incremental true
    }

测试1身份验证Espresso测试

@RunWith(AndroidJUnit4.class)
@SmallTest
public class Test1AuthenticationEspressoTest {
    @Rule
    public ActivityTestRule<WelcomeActivity> mActivityRule = new  ActivityTestRule(WelcomeActivity.class);

}

这是我遇到的错误:

junit.framework.AssertionFailedError: No tests found in com.livestrong.tracker.test.Test1AuthenticationEspressoTest

希望能得到帮助。有没有人在使用 multidex 时成功使用 Espresso 的经验?


如果你删除'multiDexEnabled = true',那么你就可以测试了,对吧?考虑一下你的项目中有一个新的模块,它有自己的Gradle文件。 - piotrek1543
https://dev59.com/8ek6XIcBkEYKwwoYEf0H#34590175 - Uriel Frankel
当我将测试运行器更改为“android.support.test.runner.AndroidJUnitRunner”时,它开始工作。 - Sayooj Valsan
我有完全相同的问题,但你所做的更改似乎都无法解决它。这太糟糕了。 - kungfoo
1个回答

41

我曾遇到过同样的问题,后来发现需要创建一个自定义运行器,使其支持 MultiDex 并继承 AndroidJUnitRunner。然后你需要在 build.gradle 中将这个运行器设置为 testInstrumentationRunner,并在运行配置中设置为你的运行器。不需要修改测试类(保留 @RunWith(AndroidJunit4.class))。

以下是具体步骤:

  1. 创建一个自定义运行器类:

    package com.bla.bla.bla;  // your package
    
    import android.os.Bundle;
    import android.support.multidex.MultiDex;
    import android.support.test.runner.AndroidJUnitRunner;
    
    public class CustomTestRunner extends AndroidJUnitRunner
    {
        @Override
        public void onCreate(Bundle arguments)
        {
            MultiDex.install(getTargetContext());
            super.onCreate(arguments);
        }
    }
    
  2. 在你的build.gradle中,将runner设置为你的自定义runner:

  3. android {
        // ...
        defaultConfig {
            // ...
            testInstrumentationRunner "com.bla.bla.bla.CustomTestRunner"
        }
    }
    
  4. 在你的运行配置中,确保检测运行程序也设置为相同的运行程序注意:此步骤不应该在Android Studio 3.x及之后版本中需要。这个选项已经不存在了。

使用上述方法,我能够在我们的支持multi-dex的应用中运行Espresso测试。

值得一提的是,关于这个话题的许多其他帖子都建议将你的运行程序设置为com.android.test.runner.MultiDexTestRunner并在build.gradle中排除com.android.support:multidex-instrumentation:1.0.1的某些依赖。但是,这种解决方案似乎不再适用于gradle 1.5.0以及之后的版本。如果你设置了任何相关内容,那么这将阻止以上方法的工作。请查看此stack overflow post中的评论获取更多信息。


4
您的回答很有前途,但我仍然遇到了一个问题:错误:执行任务“:app:transformClassesWithMultidexlistForDebugAndroidTest”失败。
com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException:进程“/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/bin/java”的命令已以非零退出值1结束。
- Anthony
2
这个答案应该被接受。 - Elye
这基本上对我来说是有效的,除了一件事:当我以这种方式运行时,任何引用从“libs”目录中拉入的jar类的代码(像这样加载compile fileTree(dir: 'libs', include: '*.jar'))都会失败并显示“NoClassDefFoundError”。其他所有东西都正常工作。 - David Pisoni
1
这个不起作用。此外,您的代码与MultiDexTestRunner中的代码完全相同,因此如果此代码起作用,则不必要。 - Gabe Sechan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接