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()
애플리케이션 컨텍스트를 얻으려면 다음을 수행해야합니다.
- @RunWith (RobolectricTestRunner.class) 주석 달기
- 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$
'code' 카테고리의 다른 글
Android 조각에서 getIntent (). getExtras ()는 어디서 / 어떻게합니까? (0) | 2020.08.17 |
---|---|
동일한 onclick에서 두 함수 호출 (0) | 2020.08.17 |
Git Checkout 경고 : 파일 링크를 해제 할 수 없습니다. 권한이 거부되었습니다. (0) | 2020.08.17 |
Rails 콘솔에 루비 스크립트 파일 전달 (0) | 2020.08.17 |
Swift의 블록 (animateWithDuration : animations : completion :) (0) | 2020.08.17 |