如何 return 导致 kotlin 挂起函数

How to return result in kotlin suspend function

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

如何使我的函数 return 成为 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()
    }
}

APIServiceInterface

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

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

谢谢 R

正如@CommonsWare 指出的那样,您需要将其包装到 Result 中,您可以通过以下方式做到这一点:

Result.success(arrayListOf(
…
))

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

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