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()?










share|improve this question


























    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()?










    share|improve this question
























      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()?










      share|improve this question













      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






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 7 at 12:20









      tynn

      18.7k54373




      18.7k54373
























          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" }





          share|improve this answer





















            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














             

            draft saved


            draft discarded


















            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

























            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" }





            share|improve this answer

























              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" }





              share|improve this answer























                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" }





                share|improve this answer












                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" }






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 7 at 12:31









                Marko Topolnik

                143k18193320




                143k18193320






























                     

                    draft saved


                    draft discarded



















































                     


                    draft saved


                    draft discarded














                    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





















































                    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







                    這個網誌中的熱門文章

                    Xamarin.form Move up view when keyboard appear

                    Post-Redirect-Get with Spring WebFlux and Thymeleaf

                    Anylogic : not able to use stopDelay()