2011-12-22 2 views
67

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

Примечание: Тест не является контрольно-измерительным тестом.

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

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

+0

Почему вы не можете использовать InstrumentationTestCase? – yorkw

+0

Потому что я испытываю услуги, а не пользовательский интерфейс. – peceps

+1

Там это лучший ответ здесь: [Использование AndroidTestCase вместо теста JUnit] [1] [1]: http://stackoverflow.com/questions/3170706/how-do-you- get-hold-of-an-android-context-for-a-junit-test-from-a-java-project –

ответ

77

Там новый подход с Android тестирование библиотеки поддержки (в настоящее время com.android.support .test: runner: 0,3).

@RunWith(AndroidJUnit4.class) 
@MediumTest 
public class SomeClassTest { 

    private Context instrumentationCtx; 

    @Before 
    public void setup() { 
     instrumentationCtx = InstrumentationRegistry.getContext(); 
    } 

    @Test 
    public void someTest() { 
     ... 

Если вы хотите также приложение контекстную пробег:

InstrumentationRegistry.getTargetContext(); 

посмотреть здесь: What's the difference between getTargetContext() and getContext (on InstrumentationRegistry)?

+0

Не работает для записи общих настроек –

+0

Наконец-то ответ на вопрос о том, как использовать JUnit4 с InstrumentationTest. После нескольких часов поиска. Должен любить разработку Android. –

+1

Ницца! tx (обратите внимание, что у вашего члена класса есть опечатка) – estoke

37

После некоторого исследования единственное рабочее решение, похоже, уже указано в одном 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)); 
    } 
} 
+7

Да, но кажется глупым, что Android не предоставляет доступ к контексту тестового проекта в простых тестах JUnit. Контекст есть в AndroidTestCase.mTestContext, но он закрыт. Я не понимаю, почему. – peceps

+0

@peceps Full Ack - но это именно так, и мне это не нравится;) – AgentKnopf

+0

@ downvoters: в ​​случае downvote, пожалуйста, найдите время, чтобы объяснить, почему, это будет полезно для меня и для всех других читателей;) – AgentKnopf

24

Как вы можете прочитать в AndroidTestCase source code , метод 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() в любое время вы хотите. :)

+2

Работал отлично для меня, и я загружаю активы, используя Context любой из AndroidTestCase с помощью этого метода, или ActivityInstrumentationTestCase2.getInstrumentation() .getContext() then getResources() .getAssets() –

+0

Прохладное решение !! Я использую ваше решение в тесте, которое расширяет ProviderTestCase2. Спасибо вам!. – pcambre

+0

Можете ли вы рассказать о том, почему они сделали это скрытым? Если мы используем эту технику, могли бы они отбросить метод в более позднем выпуске (нарушение нашего тестового кода)? –

0

Если вам нужно просто получить доступ к ресурсам вашего проекта вы можете использовать getActivity() метода 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); 
} 
2

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

AndroidTestCase Class Обзор
Продлить это, если вам необходимо получить доступ к ресурсам или другие вещи, которые зависят от деятельности контекста.

AndroidTestCase - Android Developers

0

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

Смежные вопросы