Migrating Junit4 tests to androidx: What causes 'delegate runner could not be loaded'? Migrating Junit4 tests to androidx: What causes 'delegate runner could not be loaded'? android android

Migrating Junit4 tests to androidx: What causes 'delegate runner could not be loaded'?


Removing @RunWith(AndroidJUnit4.class) annotations from the test classes fixed the issue, although I can't really say why or how it fixed it.

Edit: Allright I did some more testing. I migrated my app to Kotlin, and suddenly I noticed the tests began to work with the @RunWith annotation, too. Here's what I found out:

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 = Errorpublic class AndroidXJunitTestJava {    @BeforeClass    public static void setup() {        // Setting up once before all tests    }    @Test    public void testing() {        // Testing....    }}

This java test fails with the Delegate runner for AndroidJunit4 could not be loaded error. But If I remove the @RunWith annotation, it works. Also, if I replace the @BeforeClass setup with just a @Before, like this:

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

The tests will run without errors. I needed to use the @BeforeClass annotation, so I just removed @RunWith.

But now that I am using Kotlin, the following (which should be equal to the first java example) works:

import androidx.test.ext.junit.runners.AndroidJUnit4import org.junit.BeforeClassimport org.junit.Testimport org.junit.runner.RunWith@RunWith(AndroidJUnit4::class)class AndroidXJunitTest {    companion object {        @BeforeClass fun setup() {            // Setting up        }    }    @Test    fun testing() {        // Testing...    }}

Also, as Alessandro Biessek said in an answer and @Ioane Sharvadze in the comments, the same error can happen with the @Rule annotation. If I add a line

 @Rule val instantTaskExecutorRule = InstantTaskExecutorRule()

To the Kotlin example, the same delegate runner error happens. This must be replaced with

@get:Rule val instantTaskExecutorRule = InstantTaskExecutorRule()

Explanation here.


You also get the error message if you use a test rule in Kotlin and write it Java style

@Rulevar mainActivityActivityTestRule = ActivityTestRule(MainActivity::class.java)

You have to change @Rule to @get:Rule

@get:Rulevar mainActivityActivityTestRule = ActivityTestRule(MainActivity::class.java) 


The error message displayed when I delete the @Test method.

You can try to put a @Test method and run

@Testpublic void signInTest() {}