Android 存储库单元测试

Android repository unit test

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

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

这是我的存储库代码 -

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

首先,你的单元测试做错了。您的 UT class 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测试中class。