Android Mockito 测试室 DAO class。测试时从数据库中获取数据时获取空数组

Android Mokito Testing Room DAO class. Gettting empty array while fetching data from db while testing

正在尝试为 DAO class 编写单元测试用例。 但是插入数据后,当我尝试获取数据进行测试时,它总是 returns 一个空数组。

检查 fetchAllDataCheck() 我为编写测试用例而遵循的链接: https://codelabs.developers.google.com/codelabs/android-room-with-a-view/#0

class NewsDataBaseTest {

@Mock
lateinit var newsDao: NewsDao
@Mock
lateinit var db: AppDatabse
@Mock
lateinit var contextMock: Context

@Before
fun setup() {
    MockitoAnnotations.initMocks(this)
    newsDao = Mockito.mock(NewsDao::class.java)
    contextMock = Mockito.mock(Context::class.java)

    db = Room.inMemoryDatabaseBuilder(contextMock, AppDatabse::class.java)
        // Allowing main thread queries, just for testing.
        .allowMainThreadQueries()
        .build()
}

@After
@Throws(IOException::class)
fun closeDB() {
    db.close()
}


@Test
@Throws(Exception::class)
fun fetchAllDataCheck() {
    val note = listOf(
        Article(
            null, "Author1", "Title1", "Description1",
            "URL1", "URLTOIMAGE1", "12", "content1", null
        )
    )

    newsDao.insert(note)
    val note1 = listOf(
        Article(
            null, "AuthorTest22", "Title22", "Description222",
            "UR2L2", "URLTOIMAGE2211", "1212222", "co222ntent", null
        )
    )
    newsDao.insert(note1)
/*till this the test case is passed*/

    var allWords = newsDao.getAllNewsData()  **// this array is coming empty**
    assertEquals(allWords[0].author, "Author1")
    assertEquals(allWords[1].author, "AuthorTest22")
}

//DAO Class

@Dao
interface NewsDao {

    @Query("SELECT * from tbl_newsData")
    fun getAllNewsData(): List<Article>

    @Insert(onConflict = REPLACE)
    fun insert(newsData: List<Article>)

    @Query("DELETE from tbl_newsData")
    fun deleteAll()

    @Query("DELETE from tbl_newsData")
    fun deleteData()

}

问题是您正在访问 NewsDao 的模拟实例,应该创建 NewsDao 的真实实例或在使用 DAO 本身的 class 上测试它。 当你模拟一个对象是因为你不想知道内部实现所以你可以操纵它。例如:

@Mock
lateinit var newsDao: NewsDao

init {
    Mockito.`when`(newsDao.insert(Any())).then { //do something }
}