AndroidJUnit4.class已弃用:如何使用androidx.test.ext.junit.runners.AndroidJUnit4?

我的仪器测试用的

@RunWith(AndroidJUnit4.class)

import androidx.test.runner.AndroidJUnit4;

为了建立我的测试用例。现在这一行被标记为已弃用,提示使用AndroidJUnit4 from

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

然而,如果我试图从命名包中导入AndroidJUnit4,我会得到错误,即ext无法解决。

你有什么想法,应该在gradle中包含什么包来解决这个问题?

84501 次浏览

根据AndroidJUnit4的文档

  1. gradle文件应该包含以下行:

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

  1. 将测试类从AndroidJUnit4更改为AndroidJUnit4ClassRunner

如果它仍然不工作,请确保您清理和/或重新构建项目。你也可以直接在谷歌的maven存储库中检查当前版本

在我的例子中,将androidTestImplementation更改为testImplementation有帮助。 在阅读android build.gradle中的testimplemimplementation和androidtestimplemimplementation之间的差异

之前,我不知道两者的区别
如果你已经尝试过@MarcelGangwisch的解决方案,你的构建失败了,说它找不到资源,你也清理/重建了你的项目,它仍然不工作,试试这个: (也基于@KrzysztofDziuba的解决方案)

在你修改依赖项的gradle文件中,确保你将它添加为你需要的类型,即:

对于UI测试:

androidTestImplementation androidx.test.ext: junit: 1.1.0

对于单元测试:

testImplementation androidx.test.ext: junit: 1.1.0

在我的实例中,我添加它作为两者,现在它工作了。

我尝试了上面给出的所有方法,直到我去了官方的Android网站,他们建议从androidx.test.ext.junit.runners.AndroidJUnit4导入而不是androidx.test.runner.AndroidJUnit4链接

对我来说,以下步骤是有效的 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类仍然被弃用。所以我使用了androidx.test.platform.app.InstrumentationRegistry类中的InstrumentationRegistry.getInstrumentation().getTargetContext();

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

这对我很管用!

解决方案

  1. 将这一行添加到构建中。gradle: androidTestImplementation 'androidx.test.ext:junit:1.1.1'

  2. 在测试类中将AndroidJUnit4更改为AndroidJUnit4ClassRunner

警告

我得到了同样的错误,但下面的解决方案失败了:

File -> Invalidate cache…,选择“无效并重新启动”

  1. 在build中包含这些行。Gradle应用程序模块。

    < p > testImplementation androidx.test.ext: junit: 1.1.1的 androidTestImplementation androidx.test.ext: junit: 1.1.1的< / p > < /李>
  2. 在测试类中将测试运行程序替换为

    进口androidx.test.ext.junit.runners.AndroidJUnit4; < / p >

  3. 如果InstrumentationRegistry.getTargetContext()已弃用,则使用androidx.test.platform.app中的InstrumentationRegistry,如下所示

    .getTargetContext InstrumentationRegistry.getInstrumentation () () < / p >