1

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 스튜디오 재시작, 종속성 업데이트와 같은 사소한 수정을 시도했습니다.

다른 모듈을 조롱하면 다른 사람을 조롱하는 동안 동일한 결과가 나타납니다.

아이디어가 있으십니까?

+1

오류 메시지에서 TXT 로그 파일 참조를 얻는 방법은 https://stackoverflow.com/questions/46435789/how-to-see-the-android-orchestrator-log를 확인하십시오. – maciekjanusz

+0

링크를 제공해 주셔서 감사합니다. 파일에 포함 된 것은 : INSTRUMENTATION_RESULT : shortMsg = 프로세스가 중단되었습니다. INSTRUMENTATION_CODE : 0 전혀 유용하지 않습니다. –

답변

0

다른 모듈을 테스트했습니다. 발견 된 Refresher 모듈이 Observable 필드가있어 테스트 프로세스가 중단됩니다. 테스트 된 액티비티는 가입을 시도하지만 null입니다.

SharedData는 공유 환경 설정을 처리하기가 훨씬 더 어려웠습니다. 기본적으로 문자열과 부울을 처리합니다. 나는 모든 용도를 확인해야했다. 이미지를 얻으려면 Picasso에 문자열 값을 URL (조롱하지 않으므로 다시 null)로 넣으려고하는 동안 충돌이 발생했습니다.

이야기의 도덕적 - 하나의 적절한 충돌 메시지는 블라인드 디버깅 이틀간 가치가 있습니다.