[android] Android junit 테스트 케이스에서 테스트 프로젝트의 컨텍스트 가져 오기

누구든지 Android junit 테스트 케이스에서 테스트 프로젝트 의 컨텍스트를 얻는 방법을 알고 있습니까 (AndroidTestCase 확장).

참고 : 테스트는 계측 테스트가 아닙니다.

참고 2 : 테스트되는 실제 애플리케이션의 컨텍스트가 아니라 테스트 프로젝트의 컨텍스트가 필요합니다.

테스트 프로젝트의 자산에서 일부 파일을로드하려면 이것이 필요합니다.



답변

Android 테스트 지원 라이브러리 (현재 androidx.test:runner:1.1.1)에 새로운 접근 방식이 있습니다 . Kotlin 업데이트 예 :

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 (IntrumentationRegistry에서)의 차이점은 무엇입니까?


답변

몇 가지 연구 후에 유일한 해결책은 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));
    }
}


답변

당신이 읽을 수있는 것처럼 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()원하는 시간에 전화 하십시오. 🙂


답변

업데이트 : AndroidTestCase 이 클래스는 API 레벨 24에서 더 이상 사용되지 않습니다 InstrumentationRegistry. 대신 사용하십시오 . Android 테스트 지원 라이브러리를 사용하여 새 테스트를 작성해야합니다. 공지 사항 링크

TestCase 대신 AndroidTestCase에서 확장해야합니다.

AndroidTestCase 클래스 개요
리소스 또는 활동 컨텍스트에 의존하는 기타 항목에 액세스해야하는 경우이를 확장합니다.

AndroidTestCase-Android 개발자


답변

Kotlin 및 Mockito를 사용하여 컨텍스트를 얻으려면 다음과 같은 방법으로 수행 할 수 있습니다.

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

나는 그것의 도움을 바랍니다


답변

이것은 컨텍스트를 얻는 올바른 방법입니다. 다른 방법은 이미 사용되지 않습니다.

import androidx.test.platform.app.InstrumentationRegistry

InstrumentationRegistry.getInstrumentation().context


답변

import androidx.test.core.app.ApplicationProvider;

    private Context context = ApplicationProvider.getApplicationContext();