我正在尝试使用 Mockito 模拟我的房间数据库,以便我可以在我的存储库中测试复杂的算法。 无论我朝哪个方向走,我都会收到一系列不同的错误。
首先,我尝试模拟整个数据库对象,这创建了一个空接口异常。
为了解决这个问题,我使用了 Room 的静态对象生成器。 (这是一个插桩单元测试,所以我可以访问底层的 Android 依赖项)
import org.mockito.*
import org.mockito.Mockito.`when`
import org.mockito.Mockito.anyDouble
class BasicReposTest {
@get:Rule
val activityRule = ActivityTestRule(MainActivity::class.java)
@get:Rule
val mockitoRule: MockitoRule = MockitoJUnit.rule()
@Mock
lateinit var mockedDb : AppDatabase
@Before
fun setTheDatabase() {
val context = ApplicationProvider.getApplicationContext<Context>()
mockedDb = Room.inMemoryDatabaseBuilder(
context, AppDatabase::class.java).build()
}
@Test
fun doesReposRequestBounds() {
`when`(mockedDb.momentDao().findMomentsByBound(ArgumentMatchers.anyDouble(), ArgumentMatchers.anyDouble(),
anyDouble(), ArgumentMatchers.anyDouble())).thenReturn(momentList)
//Request first set of moments
repos.queryMapMoments(bounds, 20.toFloat())
//Do we get a list of moments sent to livedata?
assertTrue(mappedMoments.value!!.size >= momentList.size)
val list : List<Moment> = mappedMoments.value!!
for (value in list) {
System.out.println("D " + "RequestMomentsFromDatabaseByBoundsTest " + "MID = " + value.mId )
}
}
有了这个,我收到了一个误用的匹配器异常...... +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 此处检测到放错位置或误用的参数匹配器:
-> at com.example.barrechat108.RepositoryTests.doesReposRequestBounds(RepositoryTests.kt:138) -> at com.example.barrechat108.RepositoryTests.doesReposRequestBounds(RepositoryTests.kt:138) -> at com.example.barrechat108.RepositoryTests.doesReposRequestBounds(RepositoryTests.kt:139) -> at com.example.barrechat108.RepositoryTests.doesReposRequestBounds(RepositoryTests.kt:139)'
不能在验证或存根之外使用参数匹配器。 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
测试时,您可以将房间数据库构造为内存数据库。因此,存储的所有内容只会持续到该过程关闭。所以没有什么会持续存在,非常适合测试!
法典:Room.inMemoryDatabaseBuilder(context, TestDatabase::class.java).build()
我并不完全为解决方案感到自豪,但它有效。 我没有将完整的数据库对象传递给我的 Repository 类的构造函数,而是创建了另一个直接获取 dao 的重写构造函数。 这样我就可以简单地模拟 dao,而不必制作一些根本不起作用的奇怪数据库函数链。