我对Kotlin Android还是个新手.我正在try 学习测试,但收到一个错误,显示从未设置实时数据值,即使我使用AdvanceUntilIdle也是如此.
这是我的储存库
class UserRepository private constructor(
private val userPreference: UserPreference,
private val apiService: ApiService
) {
private val _loginResponse = MutableLiveData<LoginResponse?>()
val loginResponse: LiveData<LoginResponse?> = _loginResponse
private val _errorLoginMessage = MutableLiveData<String?>()
val errorLoginMessage: LiveData<String?> = _errorLoginMessage
fun login(email: String, password: String) {
_showLoading.value = true
val client = apiService.login(email, password)
client.enqueue(object : Callback<LoginResponse> {
override fun onResponse(
call: Call<LoginResponse>, response: Response<LoginResponse>
) {
_showLoading.value = false
Log.d(TAG, "Register Response : ${response.body()}")
if (response.isSuccessful && response.body() != null) {
_loginResponse.value = response.body()
} else {
_errorLoginMessage.value = response.message()
Log.e(TAG, "onFailure: ${response.message()}")
}
}
override fun onFailure(call: Call<LoginResponse>, t: Throwable) {
_showLoading.value = false
_errorLoginMessage.value = t.message
Log.e(TAG, "onFailure: ${t.message}")
}
})
}
}
这是我的取景模型
class LoginViewModel(private val repository: UserRepository) : ViewModel() {
val loginResponse: LiveData<LoginResponse?> = repository.loginResponse
val errorMessage = repository.errorLoginMessage
fun login(email: String, password: String) {
repository.login(email, password)
}
}
这是我的测试
@RunWith(RobolectricTestRunner::class)
class LoginViewModelTest {
private lateinit var viewModel: LoginViewModel
private val context = RuntimeEnvironment.getApplication().applicationContext
@get:Rule
val instantTaskExecutorRule = InstantTaskExecutorRule()
@Before
fun setup() {
val userRepository = UserRepository.getInstance(
UserPreference.getInstance(context.dataStore)
)
viewModel = LoginViewModel(
userRepository
)
Dispatchers.setMain(StandardTestDispatcher())
}
@After
fun tearDown() {
Dispatchers.resetMain()
}
@Test
fun `Test Login Failed`() = runTest {
viewModel.login("testWrongEmail@gmail.com", "testWrongPassword")
advanceUntilIdle()
val result = viewModel.loginResponse.getOrAwaitValue()
Assert.assertEquals(true, result?.error)
Assert.assertEquals("failed", result?.message)
}
}
它在运行时运行得很好,但在测试时就不行了.为什么会这样呢?
我正在try 添加InstantRuleExecutor,设置主调度程序,并添加runTest.我也试着把排队改为执行,但仍然没有结果.