【问题标题】:Android repository unit testAndroid 存储库单元测试
【发布时间】:2019-12-31 10:20:21
【问题描述】:

我的存储库单元测试存在问题,我没有得到预期的结果。谁能指出我的问题。

在测试中,从存储库中读取数据给了我一个意想不到的值。

这是我的存储库代码 -

interface DataRepository {
   suspend fun changeCustomDataBasedOnAction(action: MyAction): Result
}

class DataRepositoryImpl(
    private val cacheRepository: CacheRepository
) : DataRepository {

    override suspend fun changeCustomDataBasedOnAction(action: MyAction): Result {
        when (action) {
            is MyAction.StoreUser -> {
                print("Storing to cache" + action.userName + action.userAge)
                cacheRepository.storeUserDetails(
                    UserModel(
                        action.userName,
                        action.userAge
                    )
                )
                return isUserDetailsStored()
            }
        }
    }

    private suspend fun isUserDetailsStored(): Result {
        val result = cacheRepository.retrieveUserDetails()
        print("Reading from cache" + result)
        if (result is Result.GetUserDetails) {
            return Result.UserDetailsStored
        }
        return Result.UserDetailsNotStored
    }
}

这是我对应的单元测试——

class DataRepositoryImplTest {

    @get:Rule
    val instantExecutorRule = InstantTaskExecutorRule()

    private lateinit var dataRepository: DataRepository

    @Mock
    private lateinit var cacheRepository: CacheRepository

    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)
        dataRepository = DataRepositoryImpl(cacheRepository)
    }

    @After
    fun tearDown() {
    }

    @Test
    fun data_storeUser_returnUserDetailsStored() {
        runBlocking {

            `when`(
                dataRepository.changeCustomDataBasedOnAction(
                    MyAction.StoreUser(
                        "username", "40"
                    )
                )
            ).thenReturn(Result.UserDetailsStored)

            val result = dataRepository.changeCustomDataBasedOnAction(
                    MyAction.StoreUser(
                        "username", "40"
                    )
            )

            Assert.assertEquals(result, Result.UserDetailsStored)
        }
    }
}

问题是我得到了这个测试结果-

Storing to cache username40

Reading from cache null

Storing to cache username40

Reading from cache com.user.app.Result$UserDetailsStored@2584b82d

java.lang.AssertionError: 

Expected :com.user.app.Result$UserDetailsNotStored@7bbc8656

Actual   :com.user.app.Result$UserDetailsStored@2584b82d

【问题讨论】:

    标签: android kotlin junit kotlin-coroutines android-mvvm


    【解决方案1】:

    首先,您错误地执行了 UnitTest。这不是您的 UT 类 DataRepositoryImpl 检查用户是否已成功存储的责任。如果是这样,您需要提供 cacheRepository 的真实实例。 其次,您可以编写两个正负单元测试用例,如下所示

    @Test
    fun data_storeUser_returnUserDetailsStored() {
        runBlocking {
    
            `when`(cacheRepository.retrieveUserDetails())
            ).thenReturn(Result.GetUserDetails)
    
            val result = dataRepository.changeCustomDataBasedOnAction(
                MyAction.StoreUser(
                    "username", "40"
                )
            )
    
            Assert.assertEquals(result, ListenableWorker.Result.UserDetailsStored)
        }
    }
    
    @Test
    fun data_storeUser_returnUserDetailsNotStored() {
        runBlocking {
    
            `when`(cacheRepository.retrieveUserDetails())
            ).thenReturn(Result.UserDetailsNotStored)
    
            val result = dataRepository.changeCustomDataBasedOnAction(
                MyAction.StoreUser(
                    "username", "40"
                )
            )
    
            Assert.assertEquals(result, ListenableWorker.Result.UserDetailsNotStored)
        }
    }
    

    用于检查数据实际缓存的单元测试用例可以单独编写在 cacheRepository 测试类中。

    【讨论】:

    • 谢谢。但测试“data_storeUser_returnUserDetailsS​​tored”仍然失败,“结果”始终为“Result.UserDetailsNotStored”。这是我的“DataRepositoryImpl”是单例的原因吗?
    • @Maria 是的,您必须调试为什么条件(结果是 Result.GetUserDetails )仍然失败,即使我们已经模拟了行为 when(cacheRepository.retrieveUserDetails()) ).thenReturn(Result .GetUserDetails) 可能是实例不同,因此条件失败
    • 它现在可以工作了……我犯了一个愚蠢的错误。非常感谢:)
    • @Maria 很高兴听到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    相关资源
    最近更新 更多