aaverin
08/24/2018, 12:32 PMasync only runs when I call awaitMartin Devillers
08/24/2018, 12:36 PMasync isnt’ lazy, but it is… asynchronous (shocker). So if you check immediately after calling your registerDevice whether the registerDeviceForService method has been called on lib, then it likely won’t be the case. A new thread is spawned, so you have to wait for the method to be called on that thread.Martin Devillers
08/24/2018, 12:37 PMlib mock into your instance, but in any case, you need to find a mechanism to suspend until `lib`’s method has been calledlouiscad
08/24/2018, 12:37 PMasync does not spawn a new threadMartin Devillers
08/24/2018, 12:38 PMlouiscad
08/24/2018, 12:38 PMlouiscad
08/24/2018, 12:39 PMCoroutineDispatcher it's been assigned to (DefaultDispatcher in the current case where you pass no parameter)louiscad
08/24/2018, 12:40 PMasync for single thread operations. As long as you have suspension points, it can be usefulaaverin
08/24/2018, 12:41 PMasync methods? I thought wrapping test into runBlocking solves the problemMartin Devillers
08/24/2018, 12:45 PMlouiscad
08/24/2018, 12:47 PMDeferred. I use suspend fun instead. I use async for parallel coroutines execution, not in place of suspend fun or launch. If you really need to return a Deferred, be sure to follow the recommendations here: https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md#async-style-functions and use await() to await your Deferred inside your coroutine launched inside runBlockingaaverin
08/24/2018, 12:51 PMaaverin
08/24/2018, 12:54 PMsuspendCoroutine {}. How can I test it then? If I re-write and remove async – this suspendCoroutine still waits foreverlouiscad
08/24/2018, 12:56 PMasync is still not the right solution in this case. Have you read this guide? https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md If not, you shouldlouiscad
08/24/2018, 12:57 PMCoroutineDispatcher inside a suspend fun, I use withContext(theDispatcherIWantHere) { ... }louiscad
08/24/2018, 12:58 PMsuspendCoroutine { ... } doesn't resume, it's because resume has not be called, or because the CoroutineDispatcher is blocked somewhere in your codeaaverin
08/24/2018, 1:33 PMresume will be called only if I will have chance to mock the response
The way it usually works with RxJava, you call the method, then you catch callback on a mocked instance, and manually call that callback methods to simulate successful network responseaaverin
08/24/2018, 1:34 PMsuspendCoroutine return instantly so I could do the mock magicaaverin
08/24/2018, 1:35 PMsuspendCoroutine?louiscad
08/24/2018, 1:39 PMgildor
08/27/2018, 5:21 AMthus my original question – how to test methods withI don’t see any problem. You call this method (probably for tests easiest way to wrap this call to runBlocking), you check result of this method?suspendCoroutine