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)