Android(Kotlin)的测试室

时间:2018-11-11 20:09:20

标签: unit-testing kotlin local android-room

我正在尝试用Kotlin(本地)编写的Android中的Room数据库进行测试;不在仿真器上且未经仪器测试。据我了解,使用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()
    {
    }
}

1 个答案:

答案 0 :(得分:0)

在我看来,您已经快到了。要更改的主要内容是运行器,请使用:/etc/nginx,以及依赖项的版本。假设您的数据库和DAO设置正确,这应该可以工作(为类添加导入):

AndroidJUnit4

它对我有以下依赖性:

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()
  {
  }
}