【发布时间】:2018-11-11 20:09:19
【问题描述】:
我正在尝试在 Android 中测试使用 Kotlin 编写的 Room 数据库,本地;这不是在模拟器上,也没有instrumented测试。据我了解,这可以使用 Roboelectric 框架,但我遇到了一些麻烦:
-
如何为
RunWith(CLASS)装饰器选择合适的类?我知道
AndroidJUnit4是仪器测试所必需的,因为这是一个本地测试,我应该使用JUnit4代替或来自 RoboElectric 的其他一些衍生产品。 -
我应该如何正确确定
context?尝试
InstrumentationRegistry.getTargetContext()要求我使用InstrumentationRegistry,这在本地测试时不可用,或者在导入androidx.test.platform.app.InstrumentationRegistry或android.support.test.InstrumentationRegistry时无法导入test。尝试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()
{
}
}
【问题讨论】:
-
感谢您的开始,这让我可以在本地测试我的 Room 实现!只是一个小评论,甚至可能不是真的,你的命名约定看起来很奇怪,这些都是大写的名字。我们通常在 java 和 kotlin 中使用 CamelCase ...
标签: unit-testing kotlin local android-room