【问题标题】:Unit test fail by comparing mockk objects单元测试通过比较 mockk 对象失败
【发布时间】:2021-09-11 10:31:37
【问题描述】:

我已经实现了一个像这样的Repositoryclass:

class Repository @Inject constructor(private val dao: Dao) {

val response: LiveData<List<MyObject>> = dao.getAllObjects()
...
}

现在我为这样的代码和平编写了一个简单的单元测试:

class RepositoryTest {

@MockK
private lateinit var mockLiveData: LiveData<List<MyObject>>

@MockK
private lateinit var mockDao: Dao

@InjectMockKs
private lateinit var repository: Repository

init {
    MockKAnnotations.init(this, relaxed = true)
}

@Test
fun `Verify my objects are loaded from the database`() {
    // arrange
    every { dao.getAllObjects() } returns mockLiveData
    // assert
    verify { dao.getAllObjects() }
    assertEquals(this.mockLiveData, repository.response)
}

assertEquals 检查失败并出现错误:

Expected :LiveData(mockLiveData#2)
Actual   :LiveData(child of mockDao#5#7)

我不明白为什么对象不相等以及如何重写此测试以验证 livedata 对象是否相等?

【问题讨论】:

    标签: android unit-testing junit android-livedata mockk


    【解决方案1】:

    您的问题的原因是设置顺序。 查看您的样品,订单是:

    1. 将模拟注入到您的测试套件中
    2. 使用注入的模拟创建存储库
    3. 在单测试级别绑定dao方法,结果为mockLiveData
    4. 期望存储库字段中有正确的 liveData

    正如您在第 2 步中通过使用注解注意到的那样,您已经将 dao 与存储库绑定,默认情况下 dao.getAllObjects 返回一些模拟(mockDao 的子级)。 这就是断言失败的原因。

    您的问题的解决方案是停止使用注解@InjectMockks 并初始化存储库惰性。

    ...
    private val repository by lazy {
       Repository(dao)
    }
    
    @Test
    fun `Verify my objects are loaded from the database`() {
        every { dao.getAllObjects() } returns mockLiveData
        assertEquals(this.mockLiveData, repository.response)
    }
    
    

    干杯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 2011-01-13
      • 1970-01-01
      • 1970-01-01
      • 2017-08-15
      • 1970-01-01
      相关资源
      最近更新 更多