我正在尝试用Kotlin(本地)编写的Android中的Room数据库进行测试;不在仿真器上且未经仪器测试。据我了解,使用Roboelectric框架是可能的,但是我对此有些麻烦:
如何为RunWith(CLASS)
装饰器选择合适的类?
我知道AndroidJUnit4
对于仪器测试是必要的,因为这是本地测试,所以我应该使用JUnit4
或RoboElectric的其他衍生产品。
如何正确确定context
?
尝试InstrumentationRegistry.getTargetContext()
要求我使用InstrumentationRegistry
,这在本地测试时不可用,或者在导入test
或androidx.test.platform.app.InstrumentationRegistry
时不能导入android.support.test.InstrumentationRegistry
。尝试ApplicationProvider.getApplicationContext()
声明参考getApplicationContext
找不到。我也不确定应该从哪里导入InstrumentationRegistry
或ApplicationProvider
。
总的来说,我发现确定要在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()
{
}
}
答案 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()
{
}
}