Java.lang.RuntimeException: 无法实例化测试运行器类androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner。

7
我一执行测试就不断出现RuntimeException异常:
package com.example.mytipcalculator

import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.action.ViewActions.typeText
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.hamcrest.Matchers.containsString
import org.junit.Rule
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class CalculatorTests() {

    @get:Rule
    val activity = ActivityScenarioRule(MainActivity::class.java)

    fun test(){
        onView(withId(R.id.cost_of_service_edit_text))
        .perform(typeText("50.00"))
        .perform(ViewActions.closeSoftKeyboard())

        onView(withId(R.id.increase))
            .perform(click())

        onView(withId(R.id.increase))
            .perform(click())

        onView(withId(R.id.increase))
            .perform(click())

        onView(withId(R.id.increase))
            .perform(click())

        onView(withId(R.id.increase))
            .perform(click())

        onView(withId(R.id.calculate_button))
            .perform(click())

        onView(withId(R.id.tip_result))
            .check(matches(withText(containsString("$10.00"))))

        onView(withId(R.id.totalexpense))
            .check(matches(withText(containsString("$60.00"))))
    }
}

当我运行之前的代码时,我会得到以下的初始化错误:
java.lang.RuntimeException: Failed to instantiate test runner class androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner
Test class class com.example.mytipcalculator.CalculatorTests is malformed. (1 problems):
java.lang.Exception: No runnable methods

at androidx.test.ext.junit.runners.AndroidJUnit4.throwInitializationError(AndroidJUnit4.java:129)
at androidx.test.ext.junit.runners.AndroidJUnit4.loadRunner(AndroidJUnit4.java:121)
at androidx.test.ext.junit.runners.AndroidJUnit4.loadRunner(AndroidJUnit4.java:82)
at androidx.test.ext.junit.runners.AndroidJUnit4.<init>(AndroidJUnit4.java:56)
... 14 trimmed
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
at androidx.test.ext.junit.runners.AndroidJUnit4.loadRunner(AndroidJUnit4.java:112)
... 17 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)
... 20 more

2
你可能需要使用@Test注解来注释test()方法。 - Onik
2个回答

8

您需要使用@Test注释来注释test()方法:

@Test
fun test() {
    ...
}

5

添加@JvmField注释,我在测试Jetpack Compose时遇到了这个错误。

之前的:

@Rule
val composeRule = createComposeRule()

之后

@JvmField
@Rule
val composeRule = createComposeRule()

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