【问题标题】:Testing Room in Android (Kotlin)Android 中的测试室 (Kotlin)
【发布时间】:2018-11-11 20:09:19
【问题描述】:

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

  • 如何为RunWith(CLASS) 装饰器选择合适的类?

    我知道AndroidJUnit4 是仪器测试所必需的,因为这是一个本地测试,我应该使用JUnit4 代替或来自 RoboElectric 的其他一些衍生产品。

  • 我应该如何正确确定context

    尝试InstrumentationRegistry.getTargetContext() 要求我使用InstrumentationRegistry,这在本地测试时不可用,或者在导入androidx.test.platform.app.InstrumentationRegistryandroid.support.test.InstrumentationRegistry 时无法导入test。尝试ApplicationProvider.getApplicationContext() 声称找不到引用getApplicationContext。我也不确定应该从哪里导入InstrumentationRegistryApplicationProvider

总的来说,我发现确定要在 Java 中使用的适当库很棘手;所有文档看起来都非常特定于版本,并假设您神奇地知道从哪里导入给定的类,这样的类经常出现在一个以上的库中。然后通过 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()
    {
    }
}

【问题讨论】:

  • 感谢您的开始,这让我可以在本地测试我的 Room 实现!只是一个小评论,甚至可能不是真的,你的命名约定看起来很奇怪,这些都是大写的名字。我们通常在 java 和 kotlin 中使用 CamelCase ...

标签: unit-testing kotlin local android-room


【解决方案1】:

在我看来,你几乎就在那里。要更改的主要内容是运行器,使用: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"

【讨论】:

  • 我暂时将其标记为正确答案(恐怕我有一段时间没调查了)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 1970-01-01
相关资源
最近更新 更多