【问题标题】:Android Mokito Testing Room DAO class. Gettting empty array while fetching data from db while testingAndroid Mockito 测试室 DAO 类。测试时从数据库获取数据时获取空数组
【发布时间】:2019-08-31 21:19:01
【问题描述】:

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

检查 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类

@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()

}

【问题讨论】:

    标签: android sqlite junit android-room android-mvp


    【解决方案1】:

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

    @Mock
    lateinit var newsDao: NewsDao
    
    init {
        Mockito.`when`(newsDao.insert(Any())).then { //do something }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      • 2015-07-19
      相关资源
      最近更新 更多