Получить контекст тестового проекта в тестовом примере 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"
}
- Ваши тесты должны храниться в каталоге
src/test
. - Класс, содержащий ваш тест Robolectric, должен быть аннотирован с помощью
@RunWith(RobolectricTestRunner.class
runner). - Он также должен использовать @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();