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


107

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

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

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

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


InstrumentationTestCase를 사용할 수없는 이유는 무엇입니까?
yorkw

1
UI가 아닌 서비스를 테스트하고 있기 때문입니다.
peceps 2011

1
[1] [1] [대신 JUnit 테스트의 AndroidTestCase 사용] : 더 나은 답이 여기있다 stackoverflow.com/questions/3170706/...
제이미 보테

답변:


135

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


마지막으로 InstrumentationTest와 함께 JUnit4를 사용하는 방법에 대한 답변입니다. 몇 시간의 검색 후. Android 개발을 좋아해야합니다.
파비안 Zeindl

1
좋은! 텍사스는 (주 클래스 멤버에 오타가)
그렉

1
이것이 작동하기 위해 gradle 파일에 추가해야 할 종속성에 대해 누군가 도울 수 있습니까?
그렉

1
추가하는 것을 잊지 마십시오 compile "com.android.support.test:runner:1.0.1"당신의 Gradle을에
egorikem

2
더 이상 사용되지 않으므로 InstrumentationRegistry.getInstrumentation().context대신 사용하십시오.
Allan Veloso

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

@peceps 전체 된 승인 -하지만 그게 전부는 그것이 얼마나 나는 어느 쪽도 그와 같이 해달라고 없습니다)
AgentKnopf

25

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


2
나를 위해 완벽하게 작동했고이 메소드를 통해 AndroidTestCase 또는 ActivityInstrumentationTestCase2.getInstrumentation () .getContext () 다음 getResources () .getAssets ()
Andrew Mackenzie

그들이 왜 그것을 숨겼는지 추측 할 수 있습니까? 이 기술을 사용하면 이후 릴리스에서 메서드를 제거 할 수 있습니까 (테스트 코드가 손상됨)?
Andrew Shepherd

1
나는 얻는다java.lang.NoSuchMethodException: android.test.ServiceTestCase.getTestContext()
kurdtpage

4

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

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

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

AndroidTestCase-Android 개발자


4

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

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

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


컨텍스트에서 null을 얻습니까?
Deven

그리고 @RunWith (MockitoJUnitRunner :: class)
USMAN osman

2

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

import androidx.test.platform.app.InstrumentationRegistry

InstrumentationRegistry.getInstrumentation().context

2
import androidx.test.core.app.ApplicationProvider;

    private Context context = ApplicationProvider.getApplicationContext();

1

자동화 된 테스트를 만드는 동안 이러한 문제가 발생하는 경우 다음을 수행해야합니다.

    Context instrumentationContext;

    @Before
    public void method() {

        instrumentationContext = InstrumentationRegistry.getInstrumentation().getContext();

        MultiDex.install(instrumentationContext);
    }

0

다른 답변은 구식입니다. 현재 AndroidTestCase를 확장 할 때마다 사용할 수있는 mContext Context 개체가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.