RuntimeException:无法加载 AndroidJUnit4 的委托运行器

Had*_*adi 2 java junit android android-instrumentation

我正在尝试使用 Android Studio 为我的MainActivity.java班级使用 Junit4进行仪器测试 。我不知道我的代码是否正确,但这是我的测试类代码:

import android.widget.EditText;
import android.widget.TextView;

import androidx.test.espresso.Espresso;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.rule.ActivityTestRule;

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(AndroidJUnit4.class)
public class MainActivityTest{

    private EditText edt;
    private TextView txt;

    @Rule
    ActivityTestRule<MainActivity> activityTestRule = new ActivityTestRule<>(MainActivity.class);

    @Before
    public void setup(){
        edt = activityTestRule.getActivity().findViewById(R.id.edt);
        txt = activityTestRule.getActivity().findViewById(R.id.txt);
    }

    @Test
    public void edt_text_change() {
        //i want this test to be passed
        assertEquals("147", "147");
    }
}
Run Code Online (Sandbox Code Playgroud)

构建.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.1"
    defaultConfig {
        applicationId "package"
        minSdkVersion 15
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'com.android.support.test:rules:1.0.2'
}
Run Code Online (Sandbox Code Playgroud)

但是当我运行那个类时,Android Studio 会显示这个错误:

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:793)
at androidx.test.runner.AndroidJUnitRunner.buildRequest(AndroidJUnitRunner.java:547)
at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:390)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1890)
Run Code Online (Sandbox Code Playgroud)

Ana*_*har 9

@RunWith(AndroidJUnit4.class)从测试类中删除注释解决了这个问题,尽管我不能真正说出它为什么或如何解决它。

编辑:好吧,我做了更多的测试。我将我的应用程序迁移到 Kotlin,突然我注意到测试也开始使用@RunWith注释。这是我发现的:

import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;

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

@RunWith(AndroidJUnit4.class) // <-- @RunWith + @BeforeClass = Error
public class AndroidXJunitTestJava {

    @BeforeClass
    public static void setup() {
        // Setting up once before all tests
    }

    @Test
    public void testing() {
        // Testing....
    }
}
Run Code Online (Sandbox Code Playgroud)

此 java 测试因Delegate runner for AndroidJunit4 could not be loaded错误而失败。但是如果我删除@RunWith注释,它就可以工作。另外,如果我@BeforeClass只用 a替换设置@Before,如下所示:

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

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

@RunWith(AndroidJUnit4.class) // <-- @RunWith + @Before = works?
public class AndroidXJunitTestJava {

    @Before
    public void setup() {
        // Setting up before every test
    }

    @Test
    public void testing() {
        // Testing....
    }
}
Run Code Online (Sandbox Code Playgroud)

测试将无错误地运行。我需要使用@BeforeClass注释,所以我只是删除了@RunWith.

但是现在我正在使用 Kotlin,以下(应该等于第一个 java 示例)有效:

import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.BeforeClass
import org.junit.Test
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class AndroidXJunitTest {

    companion object {
        @BeforeClass fun setup() {
            // Setting up
        }
    }

    @Test
    fun testing() {
        // Testing...
    }

}
Run Code Online (Sandbox Code Playgroud)

此外,正如Alessandro Biessek在回答中和@Ioane Sharvadze 在评论中所说的那样,注释可能会发生同样的错误@Rule。如果我添加一行

 @Rule val instantTaskExecutorRule = InstantTaskExecutorRule()
Run Code Online (Sandbox Code Playgroud)

对于 Kotlin 示例,发生了相同的委托运行错误。这必须替换为

@get:Rule val instantTaskExecutorRule = InstantTaskExecutorRule()
Run Code Online (Sandbox Code Playgroud)

解释在这里。这就是我解决我的问题的方法