Android(Kotlin)中的测试室

问题描述 投票:1回答:1

我正在尝试用Kotlin编写的Android中的Room数据库,本地;不在仿真器上且未经instrumented测试。据我了解,使用Roboelectric框架是可能的,但是我对此有些麻烦:

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

    我理解AndroidJUnit4对于仪器测试是必要的,因为这是本地测试,所以我应该使用JUnit4或RoboElectric的其他衍生物。

  • 我应该如何正确确定context

    尝试InstrumentationRegistry.getTargetContext()要求我使用在本地测试时不可用的InstrumentationRegistry,或者在导入testandroidx.test.platform.app.InstrumentationRegistry时无法导入android.support.test.InstrumentationRegistry。尝试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()
    {
    }
}
unit-testing kotlin local android-room
1个回答
0
投票

在我看来,您几乎在那里。要更改的主要内容是运行程序,请使用: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"
© www.soinside.com 2019 - 2024. All rights reserved.