architecture-components-samples icon indicating copy to clipboard operation
architecture-components-samples copied to clipboard

java.lang.IllegalStateException: Cancel call cannot happen without a maybeRun

Open theapache64 opened this issue 4 years ago • 0 comments

I tried to use the getOrAwaitValue with Flow transformed LiveData, but am getting

java.lang.IllegalStateException: Cancel call cannot happen without a maybeRun

Here's what am doing

I am trying to test a simple ViewModel with Robolectric.

Here's my ViewModel

GreetingsViewModel.kt

@FlowPreview
@ExperimentalCoroutinesApi
class GreetingsViewModel : ViewModel() {


    private val greetingsChannel = ConflatedBroadcastChannel<String>()

    /**
     * Whenever greetingsChannel offers a value, prepend `Hello ` with it and return.
     */
    val greetingsResponse = greetingsChannel.asFlow()
        .flatMapLatest { name ->
            flowOf("Helo $name")
        }.asLiveData(viewModelScope.coroutineContext)

    /**
     * To get new greetings
     */
    fun askGreetings(name: String) {
        greetingsChannel.offer(name)
    }
}

and here's my unit test file

GreetingsViewModelTest.kt

@FlowPreview
@ExperimentalCoroutinesApi
@RunWith(AndroidJUnit4::class)
class GreetingsViewModelTest2 {

    @Test
    fun greeting_askGreetings_getWithName() {
        val testViewModel = GreetingsViewModel()
        testViewModel.askGreetings("john")
        testViewModel.greetingsResponse.getOrAwaitValue().should.equal("Hello john")
    }
}

But, when I run the test am getting below error.

java.lang.IllegalStateException: Cancel call cannot happen without a maybeRun

	at androidx.lifecycle.BlockRunner.cancel(CoroutineLiveData.kt:184)
	at androidx.lifecycle.CoroutineLiveData.onInactive(CoroutineLiveData.kt:245)
	at androidx.lifecycle.LiveData$ObserverWrapper.activeStateChanged(LiveData.java:440)
	at androidx.lifecycle.LiveData.observeForever(LiveData.java:232)
	at com.theapache64.twinkill.test.GetOrAwaitValueKt.getOrAwaitValue(getOrAwaitValue.kt:26)
	at com.theapache64.twinkill.test.GetOrAwaitValueKt.getOrAwaitValue$default(getOrAwaitValue.kt:15)
	at com.theapache64.tracktor.ui.activities.test.GreetingsViewModelTest.greeting_askGreetings_getWithName(GreetingsViewModelTest.kt:23)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.robolectric.RobolectricTestRunner$HelperTestRunner$1.evaluate(RobolectricTestRunner.java:546)
	at org.robolectric.internal.SandboxTestRunner$2.lambda$evaluate$0(SandboxTestRunner.java:252)
	at org.robolectric.internal.bytecode.Sandbox.lambda$runOnMainThread$0(Sandbox.java:89)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

Any idea why ?

theapache64 avatar Apr 27 '20 17:04 theapache64