【问题标题】:How to return result in kotlin suspend function如何在kotlin挂起函数中返回结果
【发布时间】:2021-09-04 20:20:40
【问题描述】:

我有一个挂起函数,它通过 API 调用来获取一些数据,我正在尝试为 dataRepository 函数编写一个单元测试。

如何让我的函数返回 apiServiceInterface 预期的结果

这是我的单元测试

    @RunWith(MockitoJUnitRunner::class)
class MainActivityViewModelTest {

    @get:Rule
    val coroutineRule = MainCoroutineRule()

    @Mock
    private lateinit var dataRepository: DataRepository

    @Mock
    private lateinit var dataObserver: Observer<Result<List<Character>>>

    @InjectMocks
    private lateinit var mainActivityViewModel: MainActivityViewModel

    @Test
    fun fetchCharacters() {
        runBlockingTest {
            Mockito.`when`(dataRepository.getCharacters())
                    .thenReturn( arrayListOf(Character(
                            name = "myName",
                            img = "image",
                            occupation = arrayListOf<String(),
                            status = "status",
                            nickname = "nickName",
                            appearance = arrayListOf<Int>()
                    )))
            mainActivityViewModel.fetchCharacters()
            verify(dataRepository).getCharacters()

            Mockito.verify(dataObserver).onChanged(Result.success(listOf(Character (
                    name = "myName",
                    img = "image",
                    occupation = arrayListOf(),
                    status = "status",
                    nickname = "nickName",
                    appearance = arrayListOf()
            ))))
            mainActivityViewModel.charactersLiveData.removeObserver(dataObserver)
        }
    }
}

错误信息

数据存储库

class DataRepository @Inject constructor(
    private val apiServiceInterface: ApiServiceInterface
) {
    suspend fun getCharacters(): Result<ArrayList<Character>> = kotlin.runCatching{
        apiServiceInterface.getDataFromApi()
    }
}

APIService接口

interface ApiServiceInterface {
    @GET("api/characters")
    suspend fun getDataFromApi(): ArrayList<Character>
}

你能建议我如何解决这个问题

谢谢 回复

【问题讨论】:

  • 您需要根据该错误消息将arrayListOf() 包装在Result 中。
  • 你修好了吗??结果类默认是 Kotlin 或者你有一个自定义的 Result 类??

标签: android unit-testing kotlin mockito


【解决方案1】:

正如@CommonsWare 指出的,您需要将其包装成Result,您可以这样做:

Result.success(arrayListOf(
…
))

还请注意,您发布的图片在定义occupation参数时存在语法错误:

occupation = arrayListOf<String() // here you forgot to fully enclose <String>

【讨论】:

    猜你喜欢
    • 2021-12-28
    • 1970-01-01
    • 2023-01-03
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多