无法加载 AndroidJUnit4 的委托运行程序“androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner”

a_s*_*ber 17 kotlin android-espresso

我尝试为 android 运行 Kotlin 仪器测试。

在我的 app/build.gradle 中:

    android {
        dataBinding {
            enabled = true
        }
        compileSdkVersion 28
        defaultConfig {
            applicationId "com.myproject"
            minSdkVersion 18
            targetSdkVersion 28
            versionCode 6
            versionName "0.0.7"
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        }

        sourceSets {
            main.java.srcDirs += 'src/main/kotlin'
            androidTest.java.srcDirs += 'src/androidTest/kotlin'
        }

androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0-alpha02'
    androidTestImplementation 'androidx.test.ext:junit:1.1.0'
    androidTestImplementation 'androidx.test:rules:1.1.2-alpha02'
    androidTestImplementation 'androidx.test:runner:1.1.2-alpha02'
Run Code Online (Sandbox Code Playgroud)

在文件夹中/app/src/androidTest/kotlin/com/myproject/ 我有 Kotlin 测试:

import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import org.junit.Rule
import org.junit.runner.RunWith

import androidx.test.rule.ActivityTestRule
import com.myproject.ui.activity.TradersActivity
import org.junit.Before


@RunWith(AndroidJUnit4::class)
@SmallTest
class TradersActivityTest {

    private lateinit var stringToBetyped: String

    @get:Rule
    var activityRule: ActivityTestRule<TradersActivity> = ActivityTestRule(TradersActivity::class.java)

    @Before
    fun initValidString() {
        // Specify a valid string.
        stringToBetyped = "Espresso"
    }

}
Run Code Online (Sandbox Code Playgroud)

但是当我运行测试时出现错误:

$ adb shell am instrument -w -r   -e debug false -e class 'com.myproject.TradersActivityTest' com.myproject.debug.test/androidx.test.runner.AndroidJUnitRunner
Client not ready yet..
Started running tests

java.lang.RuntimeException: Delegate runner 'androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner' for AndroidJUnit4 could not be loaded.
at androidx.test.ext.junit.runners.AndroidJUnit4.throwInitializationError(AndroidJUnit4.java:92)
at androidx.test.ext.junit.runners.AndroidJUnit4.loadRunner(AndroidJUnit4.java:82)
at androidx.test.ext.junit.runners.AndroidJUnit4.loadRunner(AndroidJUnit4.java:51)
at androidx.test.ext.junit.runners.AndroidJUnit4.<init>(AndroidJUnit4.java:46)
at java.lang.reflect.Constructor.newInstance(Native Method)
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
at androidx.test.internal.runner.junit4.AndroidAnnotatedBuilder.runnerForClass(AndroidAnnotatedBuilder.java:63)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
at androidx.test.internal.runner.AndroidRunnerBuilder.runnerForClass(AndroidRunnerBuilder.java:153)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at androidx.test.internal.runner.TestLoader.doCreateRunner(TestLoader.java:73)
at androidx.test.internal.runner.TestLoader.getRunnersFor(TestLoader.java:104)
at androidx.test.internal.runner.TestRequestBuilder.build(TestRequestBuilder.java:789)
at androidx.test.runner.AndroidJUnitRunner.buildRequest(AndroidJUnitRunner.java:544)
at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:387)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1879)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.newInstance(Native Method)
at androidx.test.ext.junit.runners.AndroidJUnit4.loadRunner(AndroidJUnit4.java:72)
... 16 more
Caused by: org.junit.runners.model.InitializationError
at org.junit.runners.ParentRunner.validate(ParentRunner.java:418)
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:84)
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:65)
at androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner.<init>(AndroidJUnit4ClassRunner.java:43)
at androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner.<init>(AndroidJUnit4ClassRunner.java:48)
... 18 more

Tests ran to completion.
Run Code Online (Sandbox Code Playgroud)

use*_*292 17

我在 kotlin 中遇到了这个问题,在下面的代码中使用并且它有效

@RunWith(AndroidJUnit4::class)

@LargeTest

class MainActivityTest {

    private val TAG = "MainActivityTest"

    @get:Rule
    val activityRule = ActivityTestRule(MainActivity::class.java)
}
Run Code Online (Sandbox Code Playgroud)

按照以下链接:- https://developer.android.com/training/testing/junit-rules

  • 将“@Rule”更改为“@get:Rule”为我解决了这个问题。 (4认同)

Jac*_*kWu 10

删除@Test 方法时显示的错误消息。

您可以尝试放置一个@Test 方法并运行

@Test
public void signInTest() {


}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案没有任何意义。当您删除测试方法时,就不再需要运行测试,因此它可以工作。但这不是重点。 (10认同)

Far*_*ABZ 7

对于那些仍然有这样问题的人,发生这种情况是因为 Kotlin 编译器想要生成 getter/setter 属性。例如,我收到此错误是因为我没有@Rule使用@get:Rule.

如果我们像这样注释属性,@get:...或者@JvmField它可以解决问题。

@get:Rule
var mActivityRule = ActivityTestRule(MainActivity::class.java)
Run Code Online (Sandbox Code Playgroud)

或者

@Rule
@JvmField
var mActivityRule = ActivityTestRule(MainActivity::class.java)
Run Code Online (Sandbox Code Playgroud)

@JvmField 指示 Kotlin 编译器不要为此属性生成 getter/setter 并将其公开为字段。


Max*_*ieh 7

关于@RunWith(AndroidJUnit4::class)

删除

import androidx.test.ext.junit.runners.AndroidJUnit4
Run Code Online (Sandbox Code Playgroud)

使用

import androidx.test.runner.AndroidJUnit4
Run Code Online (Sandbox Code Playgroud)