Testing Room in Android (Kotlin)










0














I'm trying to test a Room database in Android, written in Kotlin, locally; that is not on an emulator and without instrumented testing. As I understand it this is possible using the Roboelectric framework but I'm having some trouble with this :




  • How does one select the appropriate class for the RunWith(CLASS) decorator ?



    I understand AndroidJUnit4 is necessary for instrumented tests, given that this is a local test should I be using JUnit4 instead or some other derivative from RoboElectric.




  • How should I correctly determine the context ?



    Trying InstrumentationRegistry.getTargetContext() requires that I use InstrumentationRegistry which isn't available when testing locally or that test can not be imported when importing androidx.test.platform.app.InstrumentationRegistry or android.support.test.InstrumentationRegistry. Trying ApplicationProvider.getApplicationContext() claims the reference getApplicationContext can't be found. I'm also not sure where I should be importing either InstrumentationRegistry or ApplicationProvider from.



In general I'm finding it tricky to determine the appropriate libraries to use in Java; all the documentation appears very version specific and assumes you magically know where to import a given class from where often such a classes appear in more then one library. Then package imported through gradle also seems to be well related but does not explicitly match the package being imported. If you have any general tips on this I would be quite keen to hear it.



My code so far is as follows:



package com.manaikan.airvendor.AirTime

import android.content.Context
import android.arch.persistence.room.Room
import androidx.test.platform.app.InstrumentationRegistry
import com.manaikan.airvendor.airtime.AirVendorDatabase
import com.manaikan.airvendor.airtime.BundleQuery
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
import java.io.IOException
// Roboelectric
import androidx.test.core.app.ApplicationProvider

@RunWith(JUnit4::class)
class BundleTest

private lateinit var queryset : ENTITYDao
private lateinit var database : APPLICATIONDatabase

@Before
fun setup()

val context = ApplicationProvider.getApplicationContext<Context>()
database = Room.inMemoryDatabaseBuilder(context, APPLICATIONDatabase::class.java)
.allowMainThreadQueries()
.build()
queryset = database.bundleQuery()


@After
@Throws(IOException::class)
fun tearDown()

database.close()


@Test
@Throws(Exception::class)
fun review()












share|improve this question




























    0














    I'm trying to test a Room database in Android, written in Kotlin, locally; that is not on an emulator and without instrumented testing. As I understand it this is possible using the Roboelectric framework but I'm having some trouble with this :




    • How does one select the appropriate class for the RunWith(CLASS) decorator ?



      I understand AndroidJUnit4 is necessary for instrumented tests, given that this is a local test should I be using JUnit4 instead or some other derivative from RoboElectric.




    • How should I correctly determine the context ?



      Trying InstrumentationRegistry.getTargetContext() requires that I use InstrumentationRegistry which isn't available when testing locally or that test can not be imported when importing androidx.test.platform.app.InstrumentationRegistry or android.support.test.InstrumentationRegistry. Trying ApplicationProvider.getApplicationContext() claims the reference getApplicationContext can't be found. I'm also not sure where I should be importing either InstrumentationRegistry or ApplicationProvider from.



    In general I'm finding it tricky to determine the appropriate libraries to use in Java; all the documentation appears very version specific and assumes you magically know where to import a given class from where often such a classes appear in more then one library. Then package imported through gradle also seems to be well related but does not explicitly match the package being imported. If you have any general tips on this I would be quite keen to hear it.



    My code so far is as follows:



    package com.manaikan.airvendor.AirTime

    import android.content.Context
    import android.arch.persistence.room.Room
    import androidx.test.platform.app.InstrumentationRegistry
    import com.manaikan.airvendor.airtime.AirVendorDatabase
    import com.manaikan.airvendor.airtime.BundleQuery
    import org.junit.After
    import org.junit.Before
    import org.junit.Rule
    import org.junit.Test
    import org.junit.runner.RunWith
    import org.junit.runners.JUnit4
    import java.io.IOException
    // Roboelectric
    import androidx.test.core.app.ApplicationProvider

    @RunWith(JUnit4::class)
    class BundleTest

    private lateinit var queryset : ENTITYDao
    private lateinit var database : APPLICATIONDatabase

    @Before
    fun setup()

    val context = ApplicationProvider.getApplicationContext<Context>()
    database = Room.inMemoryDatabaseBuilder(context, APPLICATIONDatabase::class.java)
    .allowMainThreadQueries()
    .build()
    queryset = database.bundleQuery()


    @After
    @Throws(IOException::class)
    fun tearDown()

    database.close()


    @Test
    @Throws(Exception::class)
    fun review()












    share|improve this question


























      0












      0








      0







      I'm trying to test a Room database in Android, written in Kotlin, locally; that is not on an emulator and without instrumented testing. As I understand it this is possible using the Roboelectric framework but I'm having some trouble with this :




      • How does one select the appropriate class for the RunWith(CLASS) decorator ?



        I understand AndroidJUnit4 is necessary for instrumented tests, given that this is a local test should I be using JUnit4 instead or some other derivative from RoboElectric.




      • How should I correctly determine the context ?



        Trying InstrumentationRegistry.getTargetContext() requires that I use InstrumentationRegistry which isn't available when testing locally or that test can not be imported when importing androidx.test.platform.app.InstrumentationRegistry or android.support.test.InstrumentationRegistry. Trying ApplicationProvider.getApplicationContext() claims the reference getApplicationContext can't be found. I'm also not sure where I should be importing either InstrumentationRegistry or ApplicationProvider from.



      In general I'm finding it tricky to determine the appropriate libraries to use in Java; all the documentation appears very version specific and assumes you magically know where to import a given class from where often such a classes appear in more then one library. Then package imported through gradle also seems to be well related but does not explicitly match the package being imported. If you have any general tips on this I would be quite keen to hear it.



      My code so far is as follows:



      package com.manaikan.airvendor.AirTime

      import android.content.Context
      import android.arch.persistence.room.Room
      import androidx.test.platform.app.InstrumentationRegistry
      import com.manaikan.airvendor.airtime.AirVendorDatabase
      import com.manaikan.airvendor.airtime.BundleQuery
      import org.junit.After
      import org.junit.Before
      import org.junit.Rule
      import org.junit.Test
      import org.junit.runner.RunWith
      import org.junit.runners.JUnit4
      import java.io.IOException
      // Roboelectric
      import androidx.test.core.app.ApplicationProvider

      @RunWith(JUnit4::class)
      class BundleTest

      private lateinit var queryset : ENTITYDao
      private lateinit var database : APPLICATIONDatabase

      @Before
      fun setup()

      val context = ApplicationProvider.getApplicationContext<Context>()
      database = Room.inMemoryDatabaseBuilder(context, APPLICATIONDatabase::class.java)
      .allowMainThreadQueries()
      .build()
      queryset = database.bundleQuery()


      @After
      @Throws(IOException::class)
      fun tearDown()

      database.close()


      @Test
      @Throws(Exception::class)
      fun review()












      share|improve this question















      I'm trying to test a Room database in Android, written in Kotlin, locally; that is not on an emulator and without instrumented testing. As I understand it this is possible using the Roboelectric framework but I'm having some trouble with this :




      • How does one select the appropriate class for the RunWith(CLASS) decorator ?



        I understand AndroidJUnit4 is necessary for instrumented tests, given that this is a local test should I be using JUnit4 instead or some other derivative from RoboElectric.




      • How should I correctly determine the context ?



        Trying InstrumentationRegistry.getTargetContext() requires that I use InstrumentationRegistry which isn't available when testing locally or that test can not be imported when importing androidx.test.platform.app.InstrumentationRegistry or android.support.test.InstrumentationRegistry. Trying ApplicationProvider.getApplicationContext() claims the reference getApplicationContext can't be found. I'm also not sure where I should be importing either InstrumentationRegistry or ApplicationProvider from.



      In general I'm finding it tricky to determine the appropriate libraries to use in Java; all the documentation appears very version specific and assumes you magically know where to import a given class from where often such a classes appear in more then one library. Then package imported through gradle also seems to be well related but does not explicitly match the package being imported. If you have any general tips on this I would be quite keen to hear it.



      My code so far is as follows:



      package com.manaikan.airvendor.AirTime

      import android.content.Context
      import android.arch.persistence.room.Room
      import androidx.test.platform.app.InstrumentationRegistry
      import com.manaikan.airvendor.airtime.AirVendorDatabase
      import com.manaikan.airvendor.airtime.BundleQuery
      import org.junit.After
      import org.junit.Before
      import org.junit.Rule
      import org.junit.Test
      import org.junit.runner.RunWith
      import org.junit.runners.JUnit4
      import java.io.IOException
      // Roboelectric
      import androidx.test.core.app.ApplicationProvider

      @RunWith(JUnit4::class)
      class BundleTest

      private lateinit var queryset : ENTITYDao
      private lateinit var database : APPLICATIONDatabase

      @Before
      fun setup()

      val context = ApplicationProvider.getApplicationContext<Context>()
      database = Room.inMemoryDatabaseBuilder(context, APPLICATIONDatabase::class.java)
      .allowMainThreadQueries()
      .build()
      queryset = database.bundleQuery()


      @After
      @Throws(IOException::class)
      fun tearDown()

      database.close()


      @Test
      @Throws(Exception::class)
      fun review()









      unit-testing kotlin local android-room






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 11 '18 at 20:43

























      asked Nov 11 '18 at 20:09









      Carel

      804929




      804929



























          active

          oldest

          votes











          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',
          autoActivateHeartbeat: false,
          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%2f53252750%2ftesting-room-in-android-kotlin%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown






























          active

          oldest

          votes













          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes















          draft saved

          draft discarded
















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid


          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.

          To learn more, see our tips on writing great answers.





          Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


          Please pay close attention to the following guidance:


          • Please be sure to answer the question. Provide details and share your research!

          But avoid


          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.

          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53252750%2ftesting-room-in-android-kotlin%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







          Popular posts from this blog

          Use pre created SQLite database for Android project in kotlin

          Darth Vader #20

          Ondo