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

后端 未结 19 1799
长情又很酷
长情又很酷 2020-12-05 06:35

I am migrating my app to androidx, I can\'t seem to get my unit tests working. I took example from Google\'s AndroidJunitRunnerSample, which has been updated to use the new

19条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-12-05 06:41

    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 = Error
    public 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.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...
        }
    
    }
    

    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.

提交回复
热议问题