code

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

codestyles 2020. 8. 17. 08:58
반응형

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


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


최신 정보.

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

Robolectric.application;

버전 3.x의 경우 :

RuntimeEnvironment.application;

버전 4.x의 경우 :

  • build.gradle파일에 추가 :

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

    ApplicationProvider.getApplicationContext()
    

당신이 사용할 수있는

RuntimeEnvironment.application

이것을 사용하십시오 :

Robolectric.application

더하다

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

그리고 사용 :

private val app = ApplicationProvider.getApplicationContext()

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

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

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

ShadowApplication.getInstance ()

`및

Roboletric.application

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

Context context = RuntimeEnvironment.systemContext;

컨텍스트를 가져옵니다.


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


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

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

final Context context = RuntimeEnvironment.application;

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


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


@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' }


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

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

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

This is more or less following the ideas of Single Responsibility and Dependency Inversion (The S and D in SOLID)


Ok, so I know many others said this answer before and might already outdated

    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);

I got null, because the when() part was AFTER the sut initialization. It might help some of you.

also I have the

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

at the beginning of the class

Also

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

First add the following to your build.gradle:

testImplementation 'androidx.test:core:1.2.0'

then use:

ApplicationProvider.getApplicationContext() as Application


In some cases, you may need your app's context instead of the Robolectris default context. For example, if you want to get your package name. By default Robolectric will return you org.robolectric.default package name. To get your real package name do the following:

build.gradle

testImplementation 'org.robolectric:robolectric:4.2.1'

Your test class:

@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());
}

}

Make sure that in your Run/Debug Configurations Working directory is set to: $MODULE_DIR$ enter image description here enter image description here

참고URL : https://stackoverflow.com/questions/13684094/how-can-we-access-context-of-an-application-in-robolectric

반응형