我正在尝试用Kotlin编写的Android中的Room数据库,本地;不在仿真器上且未经instrumented测试。据我了解,使用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()
{
}
}
在我看来,您几乎在那里。要更改的主要内容是运行程序,请使用: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"