如何 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>
我有一个挂起函数,可以调用 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>