Robolectric에서 애플리케이션의 컨텍스트에 어떻게 액세스 할 수 있습니까?


112

실제로 API 호출에 대한 응답을 받아야합니다 Context..

답변:


218

최신 정보.

버전 1.x 및 2.x에만 사용하십시오.

Robolectric.application;

버전 3.x의 경우 :

RuntimeEnvironment.application;

버전 4.x의 경우 :

  • build.gradle파일에 추가 :

    testImplementation 'androidx.test:core:1.0.0'
    
  • 다음을 사용하여 컨텍스트를 검색하십시오.

    ApplicationProvider.getApplicationContext()
    

11
테스트를 위해 @RunWith (RobolectricTestRunner.class)를 넣었습니까?
오이겐 마르티노

4
그래 .. 내가 추가 ...하지만 여전히 null를 돌려
user1667968

1
나는 당신이 언급 한 모든 것을 수행했지만 여전히 null을 얻습니다. 내가 놓친 다른 것이 있습니까?
Moises Jimenez

13
또한 사용하지 않는 있는지 확인하십시오 RuntimeEnvironment.application(주석 방법과 같은 정적 코드에 @BeforeClassRobolectric 아마 그 시점에서 초기화되지 않고 값이 될 수있는 바와 같이) null.
sfera

1
또한 이로 인해 응용 프로그램이 테스트 사이에 출혈이 발생합니다. 이는 바람직하지 않을 수 있습니다.
Chris

26

당신이 사용할 수있는

RuntimeEnvironment.application

4
이것이 가장 좋은 대답 아마 그래서 RoboElectric 3.0, Roboelectric.application는 더 이상 존재하지 않는다
kenyee

19

이것을 사용하십시오 :

Robolectric.application

16

더하다

testImplementation "androidx.test:core-ktx:${deps.testrunner}"

그리고 사용 :

private val app = ApplicationProvider.getApplicationContext()

수입 androidx.test.core.app.ApplicationProvider
luckyhandler

브로 appContext = ApplicationProvider.getApplicationContext <컨텍스트> ()
luckyhandler

2
이것은 최신 Robolectric의 정답입니다. 여기에 언급 된 다른 방법은 더 이상 사용되지 않거나 제거되었습니다.
Gabor

7

2019 년 현재 최신 Robolectric 4.3의 경우`

ShadowApplication.getInstance ()

`및

Roboletric.application

둘 다 사용되지 않습니다. 그래서 나는

Context context = RuntimeEnvironment.systemContext;

컨텍스트를 가져옵니다.


5

애플리케이션 컨텍스트를 얻으려면 다음을 수행해야합니다.

  1. @RunWith (RobolectricTestRunner.class) 주석 달기
  2. RuntimeEnvironment.application.getApplicationContext ()

2

이것은 Robolectric 3.5.1에서 저에게 효과적입니다. ShadowApplication.getInstance().applicationContext


4.0 릴리스는이 방법을 제거 할 것 같습니다. 더 나은 고수하기 위해 RuntimeEnvironment.application또는 RuntimeEnvironment.application.getApplicationContext()당신의 작업합니다.
qix

2

현재 릴리스 4.0 알파-3 21 일, 그들은 제거 ShadowApplication.getApplicationContext() . 로 RuntimeEnvironment.application.getApplicationContext()주석이 추가 된 모든 테스트에 대해 @RunWith(RobolectricTestRunner::class).

제쳐두고 현재 가이드 에는 다음을 사용하여 문자열 리소스를 얻는 예가 있습니다.

final Context context = RuntimeEnvironment.application;

(참고 용의 javadoc 것을 RuntimeEnvironment그리고 ShadowApplication현재 비 알파 3.x의 자료를 반영합니다.)


2

먼저 다음을 추가하십시오 build.gradle.

testImplementation 'androidx.test:core:1.2.0'

그런 다음 다음을 사용하십시오.

ApplicationProvider.getApplicationContext() as Application


2

경우에 따라 Robolectris 기본 컨텍스트 대신 앱의 컨텍스트가 필요할 수 있습니다. 예를 들어, 패키지 이름을 얻으려면. 기본적으로 Robolectric은 org.robolectric.default패키지 이름 을 반환합니다 . 실제 패키지 이름을 얻으려면 다음을 수행하십시오.

build.gradle

testImplementation 'org.robolectric:robolectric:4.2.1'

테스트 클래스 :

@RunWith(RobolectricTestRunner.class)
@Config( manifest="AndroidManifest.xml")
public class FooTest {

@Test
public void fooTestWithPackageName(){
    Context context = ApplicationProvider.getApplicationContext();
    System.out.println("My Real Package Name: " + context.getPackageName());
}

}

실행 / 디버그 구성에서 작업 디렉토리가 $ MODULE_DIR $로 설정되어 있는지 확인하십시오. 여기에 이미지 설명 입력 여기에 이미지 설명 입력


1

직접 사용하는 Robolectric.getShadowApplication()것 보다 사용 하는 것이 더 안전합니다 Robolectric.application.


하지만 사용자 지정 응용 프로그램의 일부 사용자 지정 속성에 액세스해야하는 경우 어떻게해야합니까? 그림자 응용 프로그램에서 실제 개체를 얻을 수없는 것 같습니다.
Denis Kniazhev

@DenisKniazhev 죄송합니다 대답 할 수 없습니다. Robolectric을 사용하기 시작한 직후에 Travis를 CI로 사용하기 시작했지만 제대로 작동하지 않습니다. 내 생각 엔 응용 프로그램에 캐스팅하거나 그런 식으로 액세스하려면 사용자 지정 러너를 만들어야 할 수도 있습니다. 행운을 빕니다
drspaceboo 2015 년

덕분에, 지금은 그냥 붙어있다Robolectric.application
데니스 Kniazhev

6
Robolectric.getShadowApplication ()을 사용할 수 없습니다
IgorGanapolsky

1

@EugenMartynov 및 @rds ...의 답변에 동의합니다.

빠른 예는 Volley-Marshmallow-Release에서 찾을 수 있습니다.

NetworkImageViewTest.java에서

// mNIV = new NetworkImageView(Robolectric.application); mNIV = new NetworkImageView(RuntimeEnvironment.application);

Volley 링크는 https://android.googlesource.com/platform/frameworks/volley/+/marshmallow-release를 사용할 수 있습니다.

Android 스튜디오의 발리 모듈에 다음과 같이 종속성을 추가해야합니다.

dependencies { testCompile 'junit:junit:4.12' testCompile 'org.mockito:mockito-core:1.10.19' testCompile 'org.robolectric:robolectric:3.1.2' }


1

귀하의 경우에는 실제로 테스트하고있는 것이 무엇인지 염두에 두어야한다고 생각합니다. 때때로 테스트 할 수없는 코드 문제 또는 테스트 할 수없는 코드 문제 가 발생하는 것은 코드를 리팩토링해야한다는 신호입니다.

API 호출 응답의 경우 API 호출 자체를 테스트하지 않을 수 있습니다. 임의의 웹 서비스에서 정보를주고받을 수 있는지 테스트 할 필요는 없지만 코드 가 예상되는 매너에서 응답을 처리하고 처리 하는지 테스트 할 필요가 없습니다 .

어떤 경우에는 테스트하려는 코드를 리팩토링하는 것이 더 나을 수 있습니다. 응답 구문 분석 / 처리를 다른 클래스 로 나누고 샘플 문자열 응답을 주입 하여 해당 클래스String대한 테스트 수행합니다 .

이것은 어느 정도의 아이디어 다음은 단일 책임종속성 반전 합니다 ( SDSOLID )


1

좋아, 다른 많은 사람들이 이전에이 답변을 말했고 이미 구식 일 수 있음을 알고 있습니다.

    when(mockApplication.getApplicationContext()).thenReturn(RuntimeEnvironment.application);
    when(mockApplication.getFilesDir()).thenReturn(RuntimeEnvironment.application.getFilesDir());

    sharedPref = RuntimeEnvironment.application.getSharedPreferences(KEY_MY_PREF, Context.MODE_PRIVATE);
    sut = new BundleManagerImpl(mockApplication,
            processHtmlBundle, resultListener, sharedPref);

when () 부분이 sut 초기화 이후 였기 때문에 null을 얻었습니다. 여러분 중 일부는 도움이 될 것입니다.

또한 나는

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

수업 시작시

또한

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