Как вы овладеваете Android Context для теста Junit из Java Project?

Мне нужно получить доступ и контекст Android для теста JUnit.

Я пробовал использовать MockContext и расширять AndroidTestCase, но каждый раз, когда я получаю сообщение об ошибке (заглушка!)

Ответ 1

Как насчет использования AndroidTestCase вместо теста JUnit? AndroidTestCase предоставит контекст с getContext(), который можно использовать там, где он нужен.

Ответ 2

Другим способом доступа к контексту из JUnit без расширения AndroidTestCase является использование Rule для запуска тестируемой операции. Правила - это перехватчики, которые выполняются для каждого тестового метода и будут выполняться до любого из вашего кода установки в методе @Before. Правила были представлены в качестве замены для ActivityInstrumentationTestCase2.

@RunWith(AndroidJUnit4.class)
@SmallTest
public class ConnectivityTest {

    @Rule
    public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(MainActivity.class);

    @Test
    public void testIsConnected() throws Exception {
        Context context = mActivityRule.getActivity().getBaseContext();
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        boolean connected = cm.getActiveNetworkInfo().isConnectedOrConnecting();
        Assert.assertEquals(connected, ConnectionUtils.isConnected(context));
    }
}

Ответ 3

Попробуйте это для случая, когда ваш тестовый класс расширяет ActivityInstrumentationTestCase2:

InputStream is = null;
try {
    is = getInstrumentation().getContext().getAssets().open("your.file");
} catch (IOException e) {
    Log.d("Error", "Error during file opening!!!");
}

Ответ 4

Если ваш тест представляет собой контрольно-измерительный тест (работает на эмуляторе или устройстве), вы можете просто использовать

Context appContext = InstrumentationRegistry.getTargetContext();

Зависимость:

androidTestCompile 'com.android.support.test:runner:0.5'

Ответ 5

Каждое действие является подклассом контекста, поэтому вы должны использовать свои действия, когда вам нужен контекст. Контекст класса не является тем, что вы создаете из приложения.