Android 中的测试室 (Kotlin)

Testing Room in Android (Kotlin)

我正在尝试在 Android 中测试 Room 数据库,该数据库是用 Kotlin 编写的,本地;那不是在模拟器上,也没有 instrumented 测试。据我了解,使用 Roboelectric 框架是可能的,但我在这方面遇到了一些麻烦:

总的来说,我发现确定要在 Java 中使用的适当库很棘手;所有文档看起来都非常特定于版本,并假设您神奇地知道从哪里导入给定的 class,而这样的 classes 经常出现在多个库中。然后通过 gradle 导入的包似乎也很相关,但没有明确匹配正在导入的包。如果您对此有任何一般性提示,我会很想听听。

到目前为止我的代码如下:

package com.manaikan.airvendor.AirTime

import android.content.Context
import android.arch.persistence.room.Room
import androidx.test.platform.app.InstrumentationRegistry
import com.manaikan.airvendor.airtime.AirVendorDatabase
import com.manaikan.airvendor.airtime.BundleQuery
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
import java.io.IOException
// Roboelectric
import androidx.test.core.app.ApplicationProvider

@RunWith(JUnit4::class)
class BundleTest {

    private lateinit var queryset : ENTITYDao
    private lateinit var database : APPLICATIONDatabase

    @Before
    fun setup()
    {
        val context = ApplicationProvider.getApplicationContext<Context>()
        database = Room.inMemoryDatabaseBuilder(context, APPLICATIONDatabase::class.java)
            .allowMainThreadQueries()
            .build()
        queryset = database.bundleQuery()
    }

    @After
    @Throws(IOException::class)
    fun tearDown()
    {
        database.close()
    }

    @Test
    @Throws(Exception::class)
    fun review()
    {
    }
}

在我看来你就快到了。主要改的是runner,使用:AndroidJUnit4,可能还有依赖的版本。假设您的数据库和 DAO 设置正确,这应该可以工作(为您的 类 添加导入):

package com.manaikan.airvendor.AirTime

import android.content.Context
import androidx.room.Room
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.After
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import java.io.IOException

@RunWith(AndroidJUnit4::class)
class BundleTest {

  private lateinit var queryset : ChannelProgramsDao
  private lateinit var database : ChannelProgramsDatabase

  @Before
  fun setup()
  {
    val context = ApplicationProvider.getApplicationContext<Context>()
    database = Room.inMemoryDatabaseBuilder(context, APPLICATIONDatabase::class.java)
        .allowMainThreadQueries()
        .build()
    queryset = database.bundleQuery()
  }

  @After
  @Throws(IOException::class)
  fun tearDown()
  {
    database.close()
  }

  @Test
  @Throws(Exception::class)
  fun review()
  {
  }
}

它对我有以下依赖性:

  testImplementation "org.robolectric:robolectric:4.2"
  testImplementation "androidx.test.ext:junit:4.12"

  implementation "androidx.room:room-runtime:2.2.2"
  implementation "androidx.room:room-ktx:2.2.2"
  kapt "androidx.room:room-compiler:2.2.2"
  testImplementation "androidx.room:room-testing:2.2.2"