Home » Android » Get context of test project in Android junit test case

Get context of test project in Android junit test case

Posted by: admin March 11, 2020 Leave a comment

Questions:

Does anyone know how can you get the context of the Test project in Android junit test case (extends AndroidTestCase).

Note: The test is NOT instrumentation test.

Note 2: I need the context of the test project, not the context of the actual application that is tested.

I need this to load some files from assets from the test project.

How to&Answers:

There’s new approach with Android Testing Support Library (currently androidx.test:runner:1.1.1). Kotlin updated example:

class ExampleInstrumentedTest {

    lateinit var instrumentationContext: Context

    @Before
    fun setup() {
        instrumentationContext = InstrumentationRegistry.getInstrumentation().context
    }

    @Test
    fun someTest() {
        TODO()
    }
}

If you want also app context run:

InstrumentationRegistry.getInstrumentation().targetContext

Full running example: https://github.com/fada21/AndroidTestContextExample

Look here: What's the difference between getTargetContext() and getContext (on InstrumentationRegistry)?

Answer:

After some research the only working solution seems to be the one yorkw pointed out already. You’d have to extend InstrumentationTestCase and then you can access your test application’s context using getInstrumentation().getContext() – here is a brief code snippet using the above suggestions:

public class PrintoutPullParserTest extends InstrumentationTestCase {

    public void testParsing() throws Exception {
        PrintoutPullParser parser = new PrintoutPullParser();
        parser.parse(getInstrumentation().getContext().getResources().getXml(R.xml.printer_configuration));
    }
}

Answer:

As you can read in the AndroidTestCase source code, the getTestContext() method is hidden.

/**
 * @hide
 */
public Context getTestContext() {
    return mTestContext;
}

You can bypass the @hide annotation using reflection.

Just add the following method in your AndroidTestCase :

/**
 * @return The {@link Context} of the test project.
 */
private Context getTestContext()
{
    try
    {
        Method getTestContext = ServiceTestCase.class.getMethod("getTestContext");
        return (Context) getTestContext.invoke(this);
    }
    catch (final Exception exception)
    {
        exception.printStackTrace();
        return null;
    }
}

Then call getTestContext() any time you want. 🙂

Answer:

Update: AndroidTestCase This class was deprecated in API level 24.
Use InstrumentationRegistry instead. New tests should be written using the Android Testing Support Library. Link to announcement

You should extend from AndroidTestCase instead of TestCase.

AndroidTestCase Class Overview
Extend this if you need to access Resources or other things that depend on Activity Context.

AndroidTestCase – Android Developers

Answer:

If you want to get the context with Kotlin and Mockito, you can do it in the following way:

val context = mock(Context::class.java)

I Hope its help you

Answer:

This is to correct way to get the Context. Other methods are already deprecated

import androidx.test.platform.app.InstrumentationRegistry

InstrumentationRegistry.getInstrumentation().context

Answer:

For those encountering these problems while creating automated tests, you’ve gotta do this :

    Context instrumentationContext;

    @Before
    public void method() {

        instrumentationContext = InstrumentationRegistry.getInstrumentation().getContext();

        MultiDex.install(instrumentationContext);
    }

Answer:

If you need just access to resources of your project you can use getActivity() method of ActivityInstrumentationTestCase2 class:

 //...
 private YourActivityClass mActivity;
 @Override
 protected void setUp() throws Exception {
 //...
     mActivity = getActivity();

 }
 //...
 public void testAccessToResources() {
     String[] valueList;
     valueList = 
         mActivity.getResources().getStringArray(
                 com.yourporject.R.array.test_choices);
 }

Answer:

The other answers are outdated. Right now every time that you extend AndroidTestCase, there is mContext Context object that you can use.

Answer:

import androidx.test.core.app.ApplicationProvider;

    private Context context = ApplicationProvider.getApplicationContext();