Android 中的测试室 (Kotlin)
Testing Room in Android (Kotlin)
我正在尝试在 Android 中测试 Room 数据库,该数据库是用 Kotlin 编写的,本地;那不是在模拟器上,也没有 instrumented 测试。据我了解,使用 Roboelectric 框架是可能的,但我在这方面遇到了一些麻烦:
select 如何为 RunWith(CLASS)
装饰器找到合适的 class?
我知道 AndroidJUnit4
对于仪器测试是必要的,因为这是一个本地测试,我应该使用 JUnit4
还是 RoboElectric 的其他衍生产品。
如何正确判断context
?
尝试 InstrumentationRegistry.getTargetContext()
需要我使用 InstrumentationRegistry
,这在本地测试时不可用,或者在导入 androidx.test.platform.app.InstrumentationRegistry
或 [=20 时无法导入 test
=].尝试 ApplicationProvider.getApplicationContext()
声称找不到引用 getApplicationContext
。我也不确定我应该从哪里导入 InstrumentationRegistry
或 ApplicationProvider
。
总的来说,我发现确定要在 Java 中使用的适当库很棘手;所有文档看起来都非常特定于版本,并假设您神奇地知道从哪里导入给定的 class,而这样的 classes 经常出现在多个库中。然后通过 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()
{
}
}
在我看来你就快到了。主要改的是runner,使用: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"
我正在尝试在 Android 中测试 Room 数据库,该数据库是用 Kotlin 编写的,本地;那不是在模拟器上,也没有 instrumented 测试。据我了解,使用 Roboelectric 框架是可能的,但我在这方面遇到了一些麻烦:
select 如何为
RunWith(CLASS)
装饰器找到合适的 class?我知道
AndroidJUnit4
对于仪器测试是必要的,因为这是一个本地测试,我应该使用JUnit4
还是 RoboElectric 的其他衍生产品。如何正确判断
context
?尝试
InstrumentationRegistry.getTargetContext()
需要我使用InstrumentationRegistry
,这在本地测试时不可用,或者在导入androidx.test.platform.app.InstrumentationRegistry
或 [=20 时无法导入test
=].尝试ApplicationProvider.getApplicationContext()
声称找不到引用getApplicationContext
。我也不确定我应该从哪里导入InstrumentationRegistry
或ApplicationProvider
。
总的来说,我发现确定要在 Java 中使用的适当库很棘手;所有文档看起来都非常特定于版本,并假设您神奇地知道从哪里导入给定的 class,而这样的 classes 经常出现在多个库中。然后通过 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()
{
}
}
在我看来你就快到了。主要改的是runner,使用: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"