Block all Kotlin coroutines within CoroutineScope for testing
up vote
0
down vote
favorite
Suppose you have a custom coroutine scope:
class MyScope(override val coroutineContext: CoroutineContext) : CoroutineScope
Within a class you then have a function setting a global value
:
fun runSomething() {
scope.launch {
value = async { "some calculated value" }.await()
}
}
Like this I can control context
within scope
. But when I want to test runSomething()
, the tests might fail due to the async calls:
@Test
fun `runSomething should set value`() {
runSomething()
assertEquals("some calculated value", value)
}
How can I run all couroutine executions blocking within runSomething()
?
kotlin kotlinx.coroutines
add a comment |
up vote
0
down vote
favorite
Suppose you have a custom coroutine scope:
class MyScope(override val coroutineContext: CoroutineContext) : CoroutineScope
Within a class you then have a function setting a global value
:
fun runSomething() {
scope.launch {
value = async { "some calculated value" }.await()
}
}
Like this I can control context
within scope
. But when I want to test runSomething()
, the tests might fail due to the async calls:
@Test
fun `runSomething should set value`() {
runSomething()
assertEquals("some calculated value", value)
}
How can I run all couroutine executions blocking within runSomething()
?
kotlin kotlinx.coroutines
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
Suppose you have a custom coroutine scope:
class MyScope(override val coroutineContext: CoroutineContext) : CoroutineScope
Within a class you then have a function setting a global value
:
fun runSomething() {
scope.launch {
value = async { "some calculated value" }.await()
}
}
Like this I can control context
within scope
. But when I want to test runSomething()
, the tests might fail due to the async calls:
@Test
fun `runSomething should set value`() {
runSomething()
assertEquals("some calculated value", value)
}
How can I run all couroutine executions blocking within runSomething()
?
kotlin kotlinx.coroutines
Suppose you have a custom coroutine scope:
class MyScope(override val coroutineContext: CoroutineContext) : CoroutineScope
Within a class you then have a function setting a global value
:
fun runSomething() {
scope.launch {
value = async { "some calculated value" }.await()
}
}
Like this I can control context
within scope
. But when I want to test runSomething()
, the tests might fail due to the async calls:
@Test
fun `runSomething should set value`() {
runSomething()
assertEquals("some calculated value", value)
}
How can I run all couroutine executions blocking within runSomething()
?
kotlin kotlinx.coroutines
kotlin kotlinx.coroutines
asked Nov 7 at 12:20
tynn
18.7k54373
18.7k54373
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
up vote
0
down vote
Since you have the scope
available, this should work:
runBlocking { scope.coroutineContext[Job]!!.join() }
I'd like to add another detail: your async { stuff }.await()
does nothing since it starts another coroutine in the same context. On Android the scope's default dispatcher uses the GUI thread and you should send your blocking operation to a thread pool (Dispatchers.IO
). Furthermore, you don't need async-await
, but just
value withContext(Dispatchers.IO) { "some calculated value" }
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
0
down vote
Since you have the scope
available, this should work:
runBlocking { scope.coroutineContext[Job]!!.join() }
I'd like to add another detail: your async { stuff }.await()
does nothing since it starts another coroutine in the same context. On Android the scope's default dispatcher uses the GUI thread and you should send your blocking operation to a thread pool (Dispatchers.IO
). Furthermore, you don't need async-await
, but just
value withContext(Dispatchers.IO) { "some calculated value" }
add a comment |
up vote
0
down vote
Since you have the scope
available, this should work:
runBlocking { scope.coroutineContext[Job]!!.join() }
I'd like to add another detail: your async { stuff }.await()
does nothing since it starts another coroutine in the same context. On Android the scope's default dispatcher uses the GUI thread and you should send your blocking operation to a thread pool (Dispatchers.IO
). Furthermore, you don't need async-await
, but just
value withContext(Dispatchers.IO) { "some calculated value" }
add a comment |
up vote
0
down vote
up vote
0
down vote
Since you have the scope
available, this should work:
runBlocking { scope.coroutineContext[Job]!!.join() }
I'd like to add another detail: your async { stuff }.await()
does nothing since it starts another coroutine in the same context. On Android the scope's default dispatcher uses the GUI thread and you should send your blocking operation to a thread pool (Dispatchers.IO
). Furthermore, you don't need async-await
, but just
value withContext(Dispatchers.IO) { "some calculated value" }
Since you have the scope
available, this should work:
runBlocking { scope.coroutineContext[Job]!!.join() }
I'd like to add another detail: your async { stuff }.await()
does nothing since it starts another coroutine in the same context. On Android the scope's default dispatcher uses the GUI thread and you should send your blocking operation to a thread pool (Dispatchers.IO
). Furthermore, you don't need async-await
, but just
value withContext(Dispatchers.IO) { "some calculated value" }
answered Nov 7 at 12:31
Marko Topolnik
143k18193320
143k18193320
add a comment |
add a comment |
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53189374%2fblock-all-kotlin-coroutines-within-coroutinescope-for-testing%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown