UI 테스트를 실행하려고합니다. 주입 된 의존성을 조롱하지 않으면 모든 것이 잘 돌아갑니다.조롱 된 객체를 삽입 할 때 테스트 계측 프로세스가 충돌했습니다.
테스트 계측 프로세스가 충돌
실행 시작 테스트 : 나는 조롱 개체에 대한 모듈의 @Provides 수익을 전환 할 때, 나는 다음과 같은 메시지가 나타납니다. 자세한 내용은
확인 com.nerfy.features.core.CoreTest # a_shouldDisplayLocationPermissionRequestDialogAtStartup.txt .
테스트가 완료되었습니다.
어디서나이 txt 파일을 찾을 수없고 유익하지 않은 테스트 XML 만 있습니다.
편집 : 파일에 INSTRUMENTATION_RESULT : shortMsg = Process crashed 만 포함되어 있습니다. INSTRUMENTATION_CODE : 0.
앱이 잘 작동합니다.
응용 프로그램 코드 :
public class Nerfy extends Application {
private AppComponent appComponent;
public static Nerfy get(Context context) {
return (Nerfy) context.getApplicationContext();
}
@Override
public void onCreate() {
super.onCreate();
System.out.println("on create");
if (appComponent == null) {
appComponent = buildProdAppComponent();
appComponent.inject(this);
}
}
public AppComponent buildProdAppComponent() {
return DaggerAppComponent.builder()
.appModule(new AppModule(this))
.navigationModule(new NavigationModule())
.refreshModule(new RefreshModule())
.repoModule(new RepoModule())
.sharedDataModule(new SharedDataModule())
.threadsModule(new ThreadsModule())
.build();
}
//@VisibleForTesting
public void setAppComponent(AppComponent appComponent) {
System.out.println("on set");
this.appComponent = appComponent;
this.appComponent.inject(this);
}
public AppComponent getAppComponent() {
return appComponent;
}
} 여기
는 몇 가지 테스트 코드입니다 :
@RunWith(AndroidJUnit4.class)
@LargeTest
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class CoreTest {
private UiDevice device;
public SharedData sharedData;
private AppComponent espressoAppComponent;
@Rule
public ActivityTestRule<Core> mActivityRule =
new ActivityTestRule<Core>(Core.class) {
@Override
protected void beforeActivityLaunched() {
System.out.println("beforeActivityLaunched");
sharedData = mock(SharedData.class);
System.out.println("shared data " + sharedData);
espressoAppComponent = DaggerAppComponent.builder()
.appModule(new AppModule((Application) getTargetContext().getApplicationContext()))
.navigationModule(new NavigationModule())
.refreshModule(new RefreshModule())
.repoModule(new RepoModule())
.sharedDataModule(new SharedDataModule(){
@Override
public SharedData providesSharedData(Application application) {
return sharedData;
}
})
.threadsModule(new ThreadsModule())
.build();
((Nerfy) getTargetContext().getApplicationContext()).setAppComponent(espressoAppComponent);
super.beforeActivityLaunched();
}
};
@Before
public void setUp() {
}
@Test
@SdkSuppress(minSdkVersion = 23)
public void a_shouldDisplayLocationPermissionRequestDialogAtStartup() throws Exception {
assertViewWithTextIsVisible(device, TEXT_ALLOW);
assertViewWithTextIsVisible(device, TEXT_DENY);
denyCurrentPermission(device);
}
아무 것도 인쇄되지 가져옵니다.
하지만 진짜
@Override
public SharedData providesSharedData(Application application) {
return super.providesSharedData(application);
그것은 모든 것이 잘 실행 공유 데이터를 조롱하지 않기 때문에, 테스트가 제대로 실패로 조롱 공유 데이터를 전환하는 경우. 그런 다음 테스트 활동 규칙 beforeActivityLaunched 전에 응용 프로그램의 onCreate가 호출되었음을 알았습니다. 일부 자습서에서는 응용 프로그램을 작성하기 전에 호출해야한다고합니다. http://blog.sqisland.com/2015/04/dagger-2-espresso-2-mockito.html
Android Mocking a Dagger2 injected dependency for a Espresso test
How do you override a module/dependency in a unit test with Dagger 2.0?
및 이와 유사한 같은
내가 따랐다 자습서; 공식 dagger2 문서.
나는 새 모델을 만들고 테스트 용 컴포넌트 만 서브 클래 싱하려고 시도했다. 또한 beforeActivityLaunched() 대신 재정의 구성 요소를 주입 한 후 setUp() end까지 activityRule을 초기화하지 않습니다.
또한 프로젝트 재건, android 스튜디오 재시작, 종속성 업데이트와 같은 사소한 수정을 시도했습니다.
다른 모듈을 조롱하면 다른 사람을 조롱하는 동안 동일한 결과가 나타납니다.
아이디어가 있으십니까?
오류 메시지에서 TXT 로그 파일 참조를 얻는 방법은 https://stackoverflow.com/questions/46435789/how-to-see-the-android-orchestrator-log를 확인하십시오. – maciekjanusz
링크를 제공해 주셔서 감사합니다. 파일에 포함 된 것은 : INSTRUMENTATION_RESULT : shortMsg = 프로세스가 중단되었습니다. INSTRUMENTATION_CODE : 0 전혀 유용하지 않습니다. –