Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android JUnit4 Testing - Where to get Context from?

I have to build an app with sqlite usage. Now I want to write my unit tests. These unit tests should test my class SQLiteBridge. SQLiteBridge provides DAOs for every child class of Model.

Now I got the problem that I need a context to create my SQLiteBridge. SQLiteBridge creates and handles a SQLite database on the system..

Where to get the Context-Object from?

My setup is like here (so I'm using Junit4 [thanks god]): http://tools.android.com/tech-docs/unit-testing-support

EDIT: I hope there is a way like the old AndroidTestCase to extend without losing Junit4. :)

like image 615
Dominic Fuchs Avatar asked May 19 '15 07:05

Dominic Fuchs


People also ask

What do you use the AndroidJUnitRunner when running UI tests?

When you use AndroidJUnitRunner to run your tests, you can access the context for the app under test by calling the static ApplicationProvider. getApplicationContext() method. If you've created a custom subclass of Application in your app, this method returns your custom subclass's context.

Which Java framework is used to write unit tests in Android?

JUnit is a “Unit Testing” framework for Java Applications which is already included by default in android studio. It is an automation framework for Unit as well as UI Testing. It contains annotations such as @Test, @Before, @After, etc.


1 Answers

As described here: https://code.google.com/p/android-test-kit/wiki/AndroidJUnitRunnerUserGuide Use the InstrumentationRegistry to obtain the context.

However if you call InstrumentationRegistry.getContext() directly you may get an exception opening your database. I believe this is because the context returned by getContext() points to the instrumentation's context rather than that of your application / unit test. Instead use InstrumentationRegistry.getInstrumentation().getTargetContext()

For example:

@RunWith(AndroidJUnit4.class) public class SqliteTest {      Context mMockContext;      @Before     public void setUp() {         mMockContext = new RenamingDelegatingContext(InstrumentationRegistry.getTargetContext(), "test_");     } } 

The RenamingDelegatingContext simply prefixes the file/database names with test_ to prevent you from overwriting data that you may have in the same simulator.

like image 173
Dustin Avatar answered Sep 28 '22 01:09

Dustin