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

后端 未结 19 1837
长情又很酷
长情又很酷 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

    I fixed with this configuration:

    My dependencies:

    /*Instrumentation Test*/
    androidTestImplementation "org.assertj:assertj-core:3.12.2"
    androidTestImplementation ('androidx.test.espresso:espresso-core:3.2.0',{
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    androidTestImplementation "androidx.arch.core:core-testing:2.1.0-rc01"
    

    In my defaultConfig section I have:

    defaultConfig {
        applicationId "uy.edu.ude.archcomponents"
        minSdkVersion 22
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    
        testInstrumentationRunnerArguments clearPackageData: 'true'
    }
    

    In the test I have:

    package uy.edu.ude.archcomponents.repository
    
    import androidx.arch.core.executor.testing.InstantTaskExecutorRule
    import androidx.room.Room
    import androidx.test.platform.app.InstrumentationRegistry
    import androidx.test.runner.AndroidJUnit4
    import com.example.android.roomwordssample.WordDao
    import com.example.android.roomwordssample.WordRoomDatabase
    import kotlinx.coroutines.runBlocking
    import org.assertj.core.api.Assertions.assertThat
    import org.junit.After
    import org.junit.Before
    import org.junit.Rule
    import org.junit.Test
    import org.junit.runner.RunWith
    import uy.edu.ude.archcomponents.entity.Word
    import java.io.IOException
    
    
    @RunWith(AndroidJUnit4::class)
    class WordDaoTest {
    
        @get:Rule
        val instantTaskExecutorRule = InstantTaskExecutorRule()
    
        private lateinit var wordDao: WordDao
        private lateinit var db: WordRoomDatabase
    
        @Before
        fun createDb() {
            val context = InstrumentationRegistry.getInstrumentation().context
            // Using an in-memory database because the information stored here disappears when the
            // process is killed.
            db = Room.inMemoryDatabaseBuilder(context, WordRoomDatabase::class.java)
                    // Allowing main thread queries, just for testing.
                    .allowMainThreadQueries()
                    .build()
            wordDao = db.wordDao()
        }
    
        @After
        @Throws(IOException::class)
        fun closeDb() {
            db.close()
        }
    
        @Test
        @Throws(Exception::class)
        fun insertAndGetWord() {
            runBlocking {
                val word = Word("word")
                wordDao.insert(word)
                val allWords = wordDao.getAlphabetizedWords().waitForValue()
                assertThat(allWords[0].word).isEqualTo(word.word)
            }
        }
    }
    

    I also use the android plugin version 3.4.2. I took the config from here

提交回复
热议问题