Get context of test project in Android junit test case
Solution 1:
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)?
Solution 2:
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));
}
}
Solution 3:
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. :)
Solution 4:
import androidx.test.core.app.ApplicationProvider;
private Context context = ApplicationProvider.getApplicationContext();