실제로 API 호출에 대한 응답을 받아야합니다 Context
..
실제로 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
(주석 방법과 같은 정적 코드에 @BeforeClass
Robolectric 아마 그 시점에서 초기화되지 않고 값이 될 수있는 바와 같이) null
.
더하다
testImplementation "androidx.test:core-ktx:${deps.testrunner}"
그리고 사용 :
private val app = ApplicationProvider.getApplicationContext()
2019 년 현재 최신 Robolectric 4.3의 경우`
ShadowApplication.getInstance ()
`및
Roboletric.application
둘 다 사용되지 않습니다. 그래서 나는
Context context = RuntimeEnvironment.systemContext;
컨텍스트를 가져옵니다.
애플리케이션 컨텍스트를 얻으려면 다음을 수행해야합니다.
이것은 Robolectric 3.5.1에서 저에게 효과적입니다. ShadowApplication.getInstance().applicationContext
RuntimeEnvironment.application
또는 RuntimeEnvironment.application.getApplicationContext()
당신의 작업합니다.
현재 릴리스 4.0 알파-3 21 일, 그들은 제거 ShadowApplication.getApplicationContext()
. 로 RuntimeEnvironment.application.getApplicationContext()
주석이 추가 된 모든 테스트에 대해 @RunWith(RobolectricTestRunner::class)
.
제쳐두고 현재 가이드 에는 다음을 사용하여 문자열 리소스를 얻는 예가 있습니다.
final Context context = RuntimeEnvironment.application;
(참고 용의 javadoc 것을 RuntimeEnvironment
그리고 ShadowApplication
현재 비 알파 3.x의 자료를 반영합니다.)
경우에 따라 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());
}
}
직접 사용하는 Robolectric.getShadowApplication()
것 보다 사용 하는 것이 더 안전합니다 Robolectric.application
.
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
대한 테스트 를 수행합니다 .
이것은 어느 정도의 아이디어 다음은 단일 책임 및 종속성 반전 합니다 ( S 와 D 의 SOLID )
좋아, 다른 많은 사람들이 이전에이 답변을 말했고 이미 구식 일 수 있음을 알고 있습니다.
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