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

时间:2019-04-03 13:10:39

标签: 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'

在文件夹/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"
    }

}

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

$ 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.

9 个答案:

答案 0 :(得分:10)

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

@RunWith(AndroidJUnit4::class)

@LargeTest

class MainActivityTest {

    private val TAG = "MainActivityTest"

    @get:Rule
    val activityRule = ActivityTestRule(MainActivity::class.java)
}

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

答案 1 :(得分:5)

对于那些仍然有类似问题的人,发生这种情况是因为Kotlin编译器想要生成getter / setter属性。例如,出现此错误是因为我没有在@Rule中提到@get:Rule注释。

如果我们使用@get:...@JvmField注释此类属性,则可以解决问题。

@get:Rule
var mActivityRule = ActivityTestRule(MainActivity::class.java)

@Rule
@JvmField
var mActivityRule = ActivityTestRule(MainActivity::class.java)

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

答案 2 :(得分:2)

当我的测试方法中有一些参数时,出现此错误。 因此,如果有,请删除它。

@Test
fun someTestMethod(someParams: Int) { // delete method params
    assert(1==1)
}

答案 3 :(得分:2)

只要确保如果测试正在调用任何暂挂方法,就可以使用runBlocking{}运行测试。为我解决了问题

答案 4 :(得分:1)

我整天都在这个问题上浪费?

我猜您正在使用像我一样的多平台插件。

我将放弃尝试将已检测的测试移至src / androidTest / kotlin而不是src / androidTest / java

当我决定登录打印的kotlin.sourcesets.names时

[androidAndroidTest, androidAndroidTestDebug, androidDebug, androidMain, androidRelease, androidTest, androidTestDebug, androidTestRelease, commonMain, commonTest, iosArm32Main, iosArm32Test, iosArm64Main, iosArm64Test, iosX64Main, iosX64Test, macosX64Main, macosX64Test]

我意识到,为了正确解决依赖关系,我需要进行更改

androidTestImplementation -> androidAndroidTestImplementation
testImplementation -> androidTestImplementation

他们当然没有在文档中对此进行描述。 (据我发现)

...因此,例如,对于您来说,我认为您检测的测试依存关系的依存关系应为:

androidAndroidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0-alpha02'

不是

androidTestImplementation'androidx.test.espresso:espresso-core:3.2.0-alpha02'

答案 5 :(得分:0)

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

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

@Test
public void signInTest() {


}

答案 6 :(得分:0)

您没有任何带有{ "databaseConfig": { "redis": { "keyPrefix": "laravel_database_" } } } 注释的功能。这可能是问题的原因。我已经在没有@Test函数的类上使用AndroidJUnit4运行程序运行了自己的测试,并重构了这种行为。

AndroidJUnit4 JUnit4运行程序是造成此问题的原因,尽管它试图提供详细的消息(请参见引发异常的代码),但它会给您错误的消息。

以下是解决此错误的更多方法:

@Test

该错误是由于您正在编写JUnit4样式测试这一事实而产生的,并且期望它们符合JUnit4语义,但是如果错误消息更加清楚,那就太好了。

更糟糕的是,如果一个测试函数被弄乱了,由于@Test fun willThrowInitializationErrorBecauseReturnsNonUnitValue(): Int { return 0 } @Test fun willThrowInitializationErrorBecauseTakesParameters(param: Int) { } 被抛出到AndroidJUnit4类的构造函数中,因此运行程序将不会运行任何测试。

答案 7 :(得分:0)

在使用Java的情况下,我犯了以下错误时遇到了问题。

1)我已将 ActivityTestRule 设置为私有

  All test cases should be public always.

2)我没有为 BeforeClass AfterClass 方法

添加静态内容
  Methods of @BeforeClass and @AfterClass should be static

  Ex)@BeforeClass
     public static void setUp(){

     }

答案 8 :(得分:0)

也只是为了扩展答案,但由于这个特殊原因它无济于事:

如果您使用 kotlin 并在测试时获得此信息,请确保您没有在 DAO 中使用 suspend

(很抱歉把它放在这里,kotlin 中没有与此相关的线程,我已经找到了解决方案,因此它可能对某人有所帮助)