Получить контекст тестового проекта в тестовом примере Android junit

Кто-нибудь знает, как вы можете получить контекст тестового проекта в тестовом примере Android junit (расширяет AndroidTestCase).

Примечание. Тест не является проверочным тестом.

Примечание 2: Мне нужен контекст тестового проекта, а не контекст фактического тестируемого приложения.

Мне нужно это, чтобы загрузить некоторые файлы из активов из тестового проекта.

Ответ 1

Появился новый подход с библиотекой поддержки тестирования Android (в настоящее время androidx.test:runner:1.1.1). Котлин обновил пример:

class ExampleInstrumentedTest {

    lateinit var instrumentationContext: Context

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

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

Если вы хотите также запустить контекст приложения:

InstrumentationRegistry.getInstrumentation().targetContext

Полный пример: https://github.com/fada21/AndroidTestContextExample

Посмотрите здесь: в чем разница между getTargetContext() и getContext (в InstrumentationRegistry)?

Ответ 2

После некоторых исследований единственное рабочее решение, похоже, уже указано в одном yorkw. Вам нужно будет расширить InstrumentationTestCase, а затем вы можете получить доступ к контексту тестового приложения, используя getInstrumentation(). GetContext() - вот краткий фрагмент кода, в котором используются приведенные выше рекомендации:

public class PrintoutPullParserTest extends InstrumentationTestCase {

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

Ответ 3

Как вы можете прочитать в исходном коде AndroidTestCase, метод getTestContext() скрыт.

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

Вы можете обойти аннотацию @hide с помощью отражения.

Просто добавьте следующий метод в 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;
    }
}

Затем вызовите getTestContext() в любое время.:)

Ответ 4

Обновление: AndroidTestCase Этот класс устарел на уровне API 24. Вместо этого используйте InstrumentationRegistry. Новые тесты должны быть написаны с использованием библиотеки поддержки тестирования Android. Ссылка на объявление

Вы должны расширяться от AndroidTestCase вместо TestCase.

Обзор класса AndroidTestCase
Расширьте это, если вам нужен доступ к ресурсам или другим вещам, которые зависят от контекста активности.

AndroidTestCase - разработчики Android

Ответ 5

Если вы хотите получить контекст с Kotlin и Mockito, вы можете сделать это следующим образом:

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

Надеюсь, это поможет вам

Ответ 6

Это правильный способ получить контекст. Другие методы уже устарели

import androidx.test.platform.app.InstrumentationRegistry

InstrumentationRegistry.getInstrumentation().context

Ответ 7

Если вам нужен только доступ к ресурсам вашего проекта, вы можете использовать метод getActivity() класс ActivityInstrumentationTestCase2:

 //...
 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);
 }

Ответ 8

Другие ответы устарели. Прямо сейчас, когда вы расширяете AndroidTestCase, существует объект mContext Context, который вы можете использовать.

Ответ 9

Вы можете использовать Robolectric для модульного тестирования Android на JVM.

Robolectric - это инфраструктура, которая позволяет вам писать модульные тесты и запускать их на настольной JVM, все еще используя Android API.

Robolectric предоставляет совместимую с JVM версию файла android.jar. Robolectric обрабатывает инфляцию представлений, загрузку ресурсов и многое другое, что реализовано в собственном коде C на устройствах Android.

dependencies {
    ...
    // Robolectric
    testCompile "org.robolectric:robolectric:3.3.2"
}
  1. Ваши тесты должны храниться в каталоге src/test.
  2. Класс, содержащий ваш тест Robolectric, должен быть аннотирован с помощью @RunWith(RobolectricTestRunner.class runner).
  3. Он также должен использовать @Config() для указания на ваш класс BuildConfig.class.

Например

@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class)

public class WelcomeActivityTest
{
    private WelcomeActivity activity;

    @Before
    public void setUp() throws Exception
    {
        activity = Robolectric.buildActivity( WelcomeActivity.class )
                              .create()
                              .resume()
                              .get();
    }

    @Test
    public void shouldNotBeNull() throws Exception
    {
        assertNotNull( activity );
    }
}

Узнайте больше здесь

Ответ 10

import androidx.test.core.app.ApplicationProvider;

    private Context context = ApplicationProvider.getApplicationContext();