Случайный тест Crash TDD Kotlin - PullRequest
0 голосов
/ 26 июня 2019

Следующий тест ниже вызывает случайный сбой.Я в растерянности, большую часть времени он работает нормально.

> @Test fun `perform login without a previously saved user`() =
> runBlocking {
>     testSavedUser1LiveData = MutableLiveData()
> 
>     coEvery { userDao.getCurrentUserLiveData() } returns testSavedUser1LiveData
>     coEvery { userDao.upsert(any()) } returns Unit
> 
>     coEvery { userAPIDataSource.fetchLoginUser(loginCredentials) } returns Unit
>     coEvery { userAPIDataSource.getLoginUserResults } returns testUser1ResponseLiveDataOfJsonElement
> 
>     loginRepository = LoginRepositoryImpl(userDao, companyDao, userAPIDataSource)
>     loginViewModel = LoginViewModel(dispatchers, validator, loginRepository)
> 
>     loginViewModel.loginLiveData().observeForever(loginLiveDataObserver)
>     loginViewModel.login(loginCredentials)
> 
>     coVerifyOrder {
>         loginLiveDataObserver.onChanged(enableLoading)
>         loginLiveDataObserver.onChanged(loginResults)
>         loginLiveDataObserver.onChanged(disableLoading)
>     } }

Код, который сопровождает это, - забавный логин (учетные данные: LoginCredentials) {_loginLiveData.value = LoginResult.Loading (true)

    if(validator.validate(credentials)) {
        triggerLogin(credentials)
    } else {
        _loginLiveData.value = LoginResult.Failure("Incorrect Credentials")
        _loginLiveData.value = LoginResult.Loading(false)
    }
}

private fun triggerLogin(credentials: LoginCredentials) {
    launch(dispatchers.background) {
        loginRepository.performLogin(credentials)

        withContext(dispatchers.ui) {
            _loginLiveData.value = loginRepository.getLoginUserResults
            _loginLiveData.value = LoginResult.Loading(false)
        }
    }
}

сбой:

java.lang.AssertionError: Ошибка проверки: произошло меньше вызовов, чем требовалось в последовательности проверки заказа.

Matchers: Observer (# 94) .onChanged (eq (Загрузка (значение = true)))) Observer (# 94) .onChanged (eq (Success (пользователь = Текущий пользовательский ответ: 1: testUserName1)))) Наблюдатель (# 94) .onChanged (eq (Загрузка (значение = false))))

Вызовы: 1) Наблюдатель (# 94) .onChanged (Загрузка (значение = true)) 2) Наблюдатель (# 94) .onChanged (Успех (пользователь = Текущий ответ пользователя: 1: testUserName1))

Трассировки стека: 1)
io.mockk.impl.InternalPlatform.captureStackTrace
(InternalPlatform.kt:114)
io.mockk.impl.stub.MockKStub.handleInvocation
(MockKStub.kt: 256)
io.mockk.impl.instantiation.
io.mockk.proxy.jvm.advice.Interceptor.call
(Interceptor.kt: 20)
io.mockk.proxy.jvm.advice.BaseAdvice.handle
(BaseAdvice.kt:42)
io.mockk.proxy.jvm.advice.jvm.JvmMockKProxyInterceptor.interceptNoSuper (JvmMockKProxyInterceptor.java:45)
androidx.lifecycle.Observer $ Подкласс18.onChanged * 10
1027* анdroidx.lifecycle.LiveData.considerNotify
(LiveData.java:131)
androidx.lifecycle.LiveData.dispatchingValue
(LiveData.java:149)
androidx.lifecycle.LiveData.setValue
(LiveData.java:307)
androidx.lifecycle.MutableLiveData.setValue
(MutableLiveData.java:50)
com.test.testapp.ui.login.LoginViewModel.login
(LoginViewModel.kt: 84)
com.test.testapp.featureTests.login.LoginFeatureShould $ выполнить вход без ранее сохраненного пользователя $ 1.invokeSuspend
(LoginFeatureShould.kt: 102)
kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith
(ContinuationImpl.kt: 32)
kotlinx.coroutines.DispatchedTask.run
(Отправлено .: 233)
kotlinx.coroutines.EventLoopImplBase.processNextEvent
(EventLoop.kt:116)
kotlinx.coroutines.BlockingCoroutine.joinBlocking
(Builders.kt: 76)
kotlinx.coroutines.BuildersKt__BuildersKt.runБлокирование
(Builders.kt: 53)
kotlinx.coroutines.Bu.runBlocking
(-: 1)
kotlinx.coroutines.BuildersKt__BuildersKt.runБлокировка $ default
(Builders.kt: 35)
kotlinx.coroutines.BuildersKt.runBlocking $ default
(-: 1)
com.test.testapp.featureTests.login.LoginFeatureShould.perform войти в систему без ранее сохраненного пользователя (LoginFeatureShould.kt: 89)

                                                                     sun.reflect.NativeMethodAccessorImpl.invoke0                          

(NativeMethodAccessorImpl.java:-2) N
sun.reflect.NativeMethodAccessorImpl.invoke
(NativeMethodAccessorImpl.java:62)
sun.reflect.java: 43)
java.lang.reflect.Method.invoke
(Method.java:498)
org.junit.platform.commons.util.ReflectionUtils.invokeMethod
(ReflectionUtils.java:628)
org.junit.jupiter.engine.execution.ExecutableInvoker.invoke
(ExecutableInvoker.java:117)Java: 184)
org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute (ThrowableCollector.java:73)
org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod (TestMethodTestDescriptor.java:180)
org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute
(ТестМетод.execute
(TestMethodTestDescriptor.java:68)
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda $ executeRecursively $ 5 (NodeTestTask.java:135)
eng.jform.support.hierarchical.ThrowableCollector.execute (ThrowableCollector.java:73)
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda $ executeRecursively $ 7 (NodeTestTask.javait*5) или 5platform.engine.support.hierarchical.Node.around
(Node.java:135)
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda $ executeRecursively $ 8 (NodeTestTask.java:123)1083 * org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute (ThrowableCollector.java:73)
org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecurtively (NodeTestTask.java:122)
org.junit.platform.engine.support.hierarchical.NodeTestTask.execute
(NodeTestTask.java:80List.for.Eava:80ray
(ArrayList.java:1251)
org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll (SameThreadHierarchicalTestExecutorService.java:38.t.$ executeRecursively $ 5 (NodeTestTask.java:139)
org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute (ThrowableCollector.java:73)
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda $ executeRecursivelyTk: $ 7 ()
org.junit.platform.engine.support.hierarchical.Node.around
(Node.java:135)
org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda $ executeRecursively $ 8 (NodeTestTask.java:123)
org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute (ThrowableCollector.java:73)
org.junit.platform.engine.support.hierarchical.kest ()NodeTestTask.java:122)
org.junit.platform.engine.support.hierarchical.NodeTestTask.execute
(NodeTestTask.java:80)
java.util.ArrayList.forEach
(ArrayList.Java: 1251)
org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll (SameThreadHierarchicalTestExecutorService.java:38) org.junit.platform.engine.support.ierarchical.NodeTestTask.lambda $ executeRecursively $ 5 (NodeTestTask.java:139)
org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute (ThrowableCollector.java:73plash.java:73 org.it3).support.hierarchical.NodeTestTask.lambda $ executeRecursively $ 7 (NodeTestTask.java:125)
org.junit.platform.engine.support.hierarchical.Node.around
(Node.java:135)g1106.junit.platform.engine.support.hierarchical.NodeTestTask.lambda $ executeRecursively $ 8 (NodeTestTask.java:123)
org.junit.platform.engine.support.hierarchical.ThrowableCollectorrow.jecollect ()1108 * org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively (NodeTestTask.java:122)
org.junit.platform.engine.support.hierarchical.NodeTestTask.execute80)
org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit (SameThreadHierarchicalTestExecutorService.java:32) org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute (HierarchicalTestExecutor.java:57)
org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute (HierarchicalTestEngit.jpg.jjplatform.launcher.core.DefaultLauncher.execute
(DefaultLauncher.java:229)
org.junit.platform.launcher.core.DefaultLauncher.lambda $ execute $ 6
(DefaultLauncher.java:197)
org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams (DefaultLauncher.java:211)
org.junit.platform.launcher.core.DefaultLauncher.execute
(DefaultLauncher.java:19)org.junit.platform.launcher.core.DefaultLauncher.execute
(DefaultLauncher.java:128)
com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs
(JUnit5IdeaTestRunner.java:74)
com.intellij.rt.execution.junit.IdeaTestRunner $ Repeater.startRunnerWithArgs (IdeaTestRunner.java:47)
com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart
(JUnitStarter.java:242)
com.intellij.rt.execution.junit.JUnitStarter.main
(JUnitStarter.java:70)

2)
io.mockk.impl.InternalPlatform.captureStackTrace
(InternalPlatform.kt: 114) * * тысячу сто тридцать три io.mockk.impl.stub.MockKStub.handleInvocation
(MockKStub.kt: 256) * +1135 * io.mockk.impl.instantiation.JvmMockFactoryHelper $ mockHandler $ 1.invocation (JvmMockFactoryHelper.kt: 25)
io.mockk.proxy.jvm.advice.Interceptor.call (Interceptor.kt: 20)
io.mockk.proxy.jvm.advice.BaseAdvice.handle
(BaseAdvice.kt: 42)
io.mockk.proxy.jvm.advice.jvm.JvmMockKProxyInterceptor.interceptNoSuper (JvmMockKProxyInterceptor.java:45) androidx.lifecycle.Observer $ Subclass18.onChanged
(-: - 1)
androidx.lifecycle.LiveData.considerNotify
(LiveData.java:131)
androidx.lifecycle.LiveData.dispatchingValue
(LiveData.java:149)
androidx.lifecycle.LiveData.setValue
(LiveData.java:307)
androidx.lifecycle.MutableLiveData.setValue
(MutableLiveData.java:50)
com.test.testapp.ui.login.LoginViewModel $ triggerLogin $ 1 $ 1.invokeSuspend (LoginViewModel.kt: 99)
com.test.testapp.ui.login.LoginViewModel $ triggerLogin $ 1 $ 1.invoke
(LoginViewModel.kt: -1)
kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn (Undispatched.kt: 91)
kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext
(Builders.common.kt: 146)
kotlinx.coroutines.BuildersKt.withContext (-: 1)

  com.test.testapp.ui.login.LoginViewModel$triggerLogin$1.invokeSuspend
* +1158 * (LoginViewModel.kt: 98) * * 1 159 kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith

(ContinuationImpl.kt: 32) * * тысяча сто шестьдесят-один kotlinx.coroutines.DispatchedTask.run (Отправлено.kt: 233)
kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely
(CoroutineScheduler.kt: 594)
kotlinx.coroutines.scheduling.CoroutineScheduler.access $ runSafely
(CoroutineScheduler.kt: 60)
kotlinx.coroutines.scheduling.CoroutineScheduler $ Worker.run (CoroutineScheduler.kt: 742)

в io.mockk.impl.recording.states.VerifyingState.failIfNotPassed (VerifyingState.kt: 66) в io.mockk.impl.recording.states.VerifyingState.recordingDone (VerifyingState.kt: 42) в io.mockk.impl.recording.CommonCallRecorder.done (CommonCallRecorder.kt: 48) в io.mockk.impl.eval.RecordedBlockEvaluator.record (RecordedBlockEvaluator.kt: 60) в io.mockk.impl.eval.VerifyBlockEvaluator.verify (VerifyBlockEvaluator.kt: 27) в io.mockk.MockKDsl.internalCoVerify (API.kt: 143) в io.mockk.MockKDsl.internalCoVerify $ default (API.kt: 134) в io.mockk.MockKDsl.internalCoVerifyOrder (API.kt: 212) вio.mockk.MockKKt.coVerifyOrder (MockK.kt: 264) в io.mockk.MockKKt.coVerifyOrder $ default (MockK.kt: 261) в com.test.testapp.featureTests.login.LoginFeatureShould $ сохраненный вход в систему без ранее сохраненного входапользователь $ 1.invokeSuspend (LoginFeatureShould.kt: 104) на kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith (ContinuationImpl.kt: 32) на kotlinx.coroutines.DispatchedTask.run (Dispatched.kt: 233) на kotlin.EventLoopImplBase.processNextEvent (EventLoop.kt: 116) по адресу kotlinx.coroutines.BlockingCoroutine.joinBlocking (Builders.kt: 76) по адресу kotlinx.coroutines.Источник) на kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking $ default (Builders.kt: 35) на kotlinx.coroutines.BuildersKt.runBlocking $ default (Неизвестный источник) на com.test.testapp.featureTests.login.LoginFeatureShould.ранее сохраненный пользователь (LoginFeatureShould.kt: 89) на sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) метод восстановления (java) в java498) в org.junit.platform.commons.util.ReflectionUtils.invokeMethod (ReflectionUtils.java:628) в org.junit.jupiter.engine.execution.ExecutableInvoker.invoke (ExecutableInvoker.java:117) в org.junit.jupit.engine.descriptor.descriptor.TestMethodTestDescriptor.invokeTestMethod (TestMethodTestDescriptor.java:180) по адресу org.junit.jupiter.engine.descriptor.Ява: 68) в org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda $ executeRecursively $ 5 (NodeTestTask.java:135) в org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute (ThrowableCollectun.gt..engine.support.hierarchical.NodeTestTask.lambda $ executeRecursively $ 7 (NodeTestTask.java:125) в org.junit.platform.engine.support.hierarchical.Node.around (Node.java:135) в org.junit.platengine.support.hierarchical.NodeTestTask.lambda $ executeRecursively $ 8 (NodeTestTask.java:123) в org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute (ThrowableCollector.jlatjunitit или org) или в.support.hierarchical.NodeTestTask.executeRecurtely (NodeTestTask.java:122) в org.junit.platform.engine.support.hierarchical.NodeTestTask.execute (NodeTestTask.java:80) в массиве java.for.: 1251) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll (SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda $ executeRecursively $ 5 (NodeTestTask.java:139) в org.junit.platform.engine.support.hierarchical.ThrowableColoror.java: 73) в org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda $ executeRecursively $ 7 (NodeTestTask.java:125) в org.junit.platform.engine.support.hierarchical.Node.around (нет.Java: 135) в org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda $ executeRecursively $ 8 (NodeTestTask.java:123) в org.junit.platform.engine.support.hierarchical.ThrowableColorj.jpg: 73) в org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively (NodeTestTask.java:122) вorg.junit.platform.engine.support.hierarchical.NodeTestTask.execute (NodeTestTask.java:80) в java.util.ArrayList.forEach (ArrayList.java:1251) в org.junit.platform.engine.support.higure.SameThreadHierarchicalTestExecutorService.invokeAll (SameThreadHierarchicalTestExecutorService.java:38) atg.execute (ThrowableCollector.java:73) в org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda $ executeRecursively $ 7 (NodeTestTask.java:125) в org.junit.platform.engine.suical.около (Node.java:135) в org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda $ executeRecursively $ 8 (NodeTestTask.java:123) в org.junit.platform.engine.support.hierarchicalorThableable(ThrowableCollector.java:73) в org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively (NodeTestTask.java:122) в org.junit.platform.engine.support.hierarchical.NodeTestTask.execute (NodeTestTask.java:80) в org.junit.platform.engine.support.hierarchical.SiteTerviceHutor.Hec.Java: 32) в org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute (HierarchicalTestExecutor.java:57) в org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.exavaTextEngine.exavaTв org.junit.platform.launcher.core.DefaultLauncher.execute (DefaultLauncher.java:229) в org.junit.platform.launcher.core.DefaultLauncher.lambda $ выполнить $ 6 (DefaultLauncher.java:197) в org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams (DefaultLauncher.java:211) в org.junit.platform.launcher.core.DefaultLauncher.execute (DefaultLauncher.java:191) в org.junit.platore.uncefl.выполнить (DefaultLauncher.java:128) в com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs (JUnit5IdeaTestRunner.java:74) в com.intellij.rt.execution.junit.IdeaTestRunner $ Repeater.startRunnerWithArgs (IdeaTestRunner.java:47) в com.intellij.rt.ittart.jt.242) at com.intellij.rt.execution.junit.JUnitStarter.main (JUnitStarter.java:70)

1 Ответ

0 голосов
/ 26 июня 2019

Проверьте timeout функцию в документах или на носителе о расширенных функциях (снова ссылка на https://mockk.io)

...