不推荐使用AndroidJUnit4.class:如何使用androidx.test.ext.junit.runners.AndroidJUnit4?


254

我在进行仪器测试时

@RunWith(AndroidJUnit4.class)

import androidx.test.runner.AndroidJUnit4;

为了建立我的测试用例。现在,这条线被标记为与提示使用过时AndroidJUnit4

import androidx.test.ext.junit.runners.AndroidJUnit4

但是,如果我尝试AndroidJUnit4从命名包中导入,ext则会出现错误,无法解决。

您有什么想法,应在gradle中包括哪些软件包来解决此问题?



4
我认为您的来源已过时,他们根本没有提到androidx。
Marcel Gangwisch

1
Android上的单元测试充满了许多错误和不推荐使用的东西。对我而言唯一有效的方法是创建一个新的草稿项目,将相关文件从该项目复制到我的项目中,切换到调试模式,并进行完全缓存无效化。同样对于AndroidJUnit4测试,程序包名称必须与库程序包名称匹配。
罗珀特·罗恩斯利

Answers:


375

根据AndroidJUnit4的文档

  1. gradle文件应包含以下行: androidTestImplementation 'androidx.test.ext:junit:1.1.1'

  2. 将测试类别AndroidJUnit4ClassRunner从更改为AndroidJUnit4

如果仍然无法使用,请确保清理和/或重建项目。您也可以直接在Google的Maven存储库中检查当前版本


20
我的gradle有这个,仍然无法解决问题。
zuko

@zuko清理和/或重建您的项目,它应该在那里。如果还没有,并且您正在使用模块,请检查是否按预期设置了依赖关系层次结构;您可能还需要将它们添加到顶级模块中-因为测试库没有被编译成共享模块供上游模块使用。
乔恩·亚当斯

@JonAdams我的依赖树出于某种原因一直保持对旧库的引用,即使我以为我删除了它们。因此,在尝试了各种方法之后,我最终只是将项目迁移到一个新的项目,现在一切都很好。
zuko

7
我们应该还改变testInstrumentationRunner在gradle这个文件从androidx.test.runner.AndroidJUnitRunnerandroidx.test.ext.junit.runners.AndroidJUnit4?只是想知道是否存在不匹配。
Droid

22
@A Droid用新软件包替换导入的旧AndroidJUnit4软件包。只需替换import androidx.test.runner.AndroidJUnit4; 与导入androidx.test.ext.junit.runners.AndroidJUnit4;
Xplosive

27

如果您尝试过@MarcelGangwisch的解决方案,并且构建失败说它找不到资源,并且您也清理/重建了项目,但仍然无法正常工作,请尝试以下方法:(也基于@KrzysztofDziuba的解决方案)

在更改依赖关系的gradle文件中,确保将其添加为所需的类型,即:

对于UI测试:

androidTestImplementation'androidx.test.ext:junit:1.1.0'

对于单元测试:

testImplementation'androidx.test.ext:junit:1.1.0'

在我的实例中,我将两者同时添加,现在可以使用了。


13

  1. 将此行添加到build.gradle中: androidTestImplementation 'androidx.test.ext:junit:1.1.1'

  2. 更改AndroidJUnit4AndroidJUnit4ClassRunner测试班

警告

我遇到了同样的错误,但是以下解决方案对我来说失败了:

File-> Invalidate Caches ...,然后选择Invalidate and Restart


12

对我而言,以下步骤有效:
1.将androidx库替换为此处发布的库。我的决赛app/build.gradle看起来像这样:

android {
    ...
    defaultConfig {
        ...
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

    }
    ...
}

dependencies {
    ...
    testImplementation 'junit:junit:4.12'

    // Core library
    androidTestImplementation 'androidx.test:core:1.2.0'

    // AndroidJUnitRunner and JUnit Rules
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test:rules:1.2.0'

    // Assertions
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.ext:truth:1.2.0'
    androidTestImplementation 'com.google.truth:truth:0.42'

    // Espresso dependencies
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

}

然后,我将ExampleInstrumentTest.java班级中导入的模块手动替换为最新班级:

import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(AndroidJUnit4ClassRunner.class)
public class ExampleInstrumentedTest {
    ...
    @Rule
    public final ActivityTestRule<MainActivity> main = new ActivityTestRule<>(MainActivity.class, true);

    @Before
    public void init() {
        ...
    }
    @Test
    public void listCount() {
        ...
    }

    @Test
    public void useAppContext() {
        Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();

        Assert.assertEquals("in.curioustools.aad_x_testing2", appContext.getPackageName());
        System.out.println("useAppContext : Test Ran");
    }
}

让我烦恼的是,InstrumentationRegistery该类仍被弃用。所以我InstrumentationRegistry.getInstrumentation().getTargetContext();androidx.test.platform.app.InstrumentationRegistry课堂上使用。


3
@RunWith(AndroidJUnit4ClassRunner.class)是我的问题得到解决的部分。我真的不明白为什么android studio有时会生成不赞成使用的代码。
Rafsanjani

使用ApllicationProvider.getApplicationContext<Context>()代替InstrumentationRegistry.getInstrumentation().getTargetContext();
Mitch19'9

7

我尝试了上面提供的所有内容,直到转到了Android的官方网站,他们建议使用androidx.test.ext.junit.runners.AndroidJUnit4而不是进行导入androidx.test.runner.AndroidJUnit4链接



0

如果您导入了那些AnroidX测试库,则同步并重新构建了项目,但是导入的包仍然无法解析。只要记住如何将项目升级到AndroidX,关闭Android Studio并删除.idea文件夹并再次重新打开项目即可 ...

这对我有用!


0
  1. 将这些行包括在build.gradle应用程序模块中。

    testImplementation'androidx.test.ext:junit:1.1.1'androidTestImplementation'androidx.test.ext:junit:1.1.1'

  2. 在测试课程中,将测试跑步者替换为

    导入androidx.test.ext.junit.runners.AndroidJUnit4;

  3. 如果InstrumentationRegistry.getTargetContext()是过时的使用InstrumentationRegistry距离androidx.test.platform.app这样的

    InstrumentationRegistry.getInstrumentation()。getTargetContext()

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.