2017-05-02 8 views
4

AndroidInjector 및 하위 구성 요소를 사용하면 범위가 지정된 활동 범위를 에스프레소의 Test 클래스에 삽입 할 수 없습니다.AndroidInjector 및 Espresso

이전에는 응용 프로그램 수준 구성 요소 및 활동 구성 요소를 사용하여 활동 구성 요소를 상속 한 테스트 구성 요소를 만들면 활동이 아닌 테스트 클래스에 대해 inject()를 호출 할 수있었습니다.

예 :

활동의 구성 요소

@ActivityScope 
@Component(
    dependencies = ApplicationComponent.class, 
    modules = { 
      NowPlayingActivityModule.class 
    }) 
public interface NowPlayingActivityComponent { 
    void inject(NowPlayingActivity activity); 
} 

테스트 클래스 구성 요소

@ActivityScope 
@Component(
    dependencies = TestApplicationComponent.class, 
    modules = { 
      TestNowPlayingActivityModule.class, 
      ActivityModule.class 
    }) 
public interface TestNowPlayingActivityComponent extends NowPlayingActivityComponent { 
    void inject(NowPlayingActivityTest nowPlayingActivityTest); 
} 

테스트 모듈

@Module 
public class TestNowPlayingActivityModule { 
    private NowPlayingActivityModule nowPlayingActivityModule; 

    public TestNowPlayingActivityModule(NowPlayingActivityModule nowPlayingActivityModule) { 
     this.nowPlayingActivityModule = nowPlayingActivityModule; 
    } 

    @Provides 
    @ActivityScope 
    public ServiceGateway providesServiceGateway(ServiceApi serviceApi) { 
     return nowPlayingActivityModule.providesServiceGateway(serviceApi); 
    } 

    @Provides 
    @ActivityScope 
    public NowPlayingPresenter providesNowPlayingPresenter(NowPlayingInteractor nowPlayingInteractor) { 
     //In order to make sure espresso idles the view checks, we put the IdlingResource on the presenter. 
     return Mockito.spy(new NowPlayingPresenterImpl_IdlingResource(nowPlayingActivityModule.getNowPlayingViewModel(), 
      nowPlayingInteractor)); 
    } 
} 

테스트에서는 클래스

TestNowPlayingActivityComponent mockNowPlayingActivityComponent = DaggerTestNowPlayingActivityComponent.builder() 
      .testApplicationComponent((TestApplicationComponent) mvpExampleApplication.getComponent()) 
      .testNowPlayingActivityModule(new TestNowPlayingActivityModule(nowPlayingActivityModule)) 
      .build(); 

mockNowPlayingActivityComponent.inject((NowPlayingActivity) activity); 
mockNowPlayingActivityComponent.inject(NowPlayingActivityTest.this); 

에스프레소 UI 테스트에서 자동 생성되고 사용되는 활동 모듈에 액세스하는 방법은 무엇입니까? 위의 "ServiceGateway"& "NowPlayingPresenter"와 같은 객체에 액세스하여 테스트에 활용하려고합니다. 모의, 스파이 또는 유휴 리소스. 위의 예에서 내 유휴 자원은 각 개별 테스트 중에 에스프레소에 전달하는 "NowPlayingPresenter"구체 구현입니다.

+0

당신이 내 솔루션 [여기] (HTTPS 검사 수행 할 방법을 결정하고 있으면 경우 모의을 제공 : /을 /stackoverflow.com/a/45545442/8326724) –

답변

0

나는 비슷한 상황에 처해있다. 내 질문은 Espresso testing with Dagger 2 and custom scopes입니다. Espresso로 테스트 할 때 mock을 주입하는 것은 정말 까다 롭습니다.

mcassiano가 제안한 접근 방식은이 문제를 해결하기 위해 떠오른 첫 번째 아이디어였습니다. 그러나, 나는 코드 오버 헤드를 생성해야하기 때문에이 접근법을 사용하지 않았다. mcassiano가 만든 에스프레소 테스트가 어떻게 생겼는지보고 싶습니다. 나는 여러분이 mock을 주입하기 위해 오버라이드 한 Activity에 대한 ActivityTestRule을 작성한다고 가정합니다. 단검 2를 사용하는 이상적인 시나리오에서

나는 다음과 같은 피하기 위해 싶습니다

  • 응용 프로그램 구성 요소 전체에 모든 종속성을 제공하는 다른 모든 구성 요소의 인식 응용 프로그램 구성 요소가 app

후자는 위의 상황에서 우리가 끝내면 모든 앱 기능과 밀접하게 결합 된 거대한 App 구성 요소와 모듈을 갖기 때문에 코드 냄새라고 생각합니다.

대신 모든 기능이 자체 종속성을 주입하도록해야합니다.

모의 주입 솔루션을 찾는 것과 관련하여 구현 코드와 테스트를 혼합하고 싶지 않기 때문에 구현하지 않은 아이디어가 아래에 있습니다. 그러나, 당신이 생각하는 것을 너희가 나누는다면 감사 할 것이다.

  1. 만 초기화하는 경우이 설정에 가서 테스트 설정의 일부로과 활동 코드에서 초기화 그렇지 않으면 실제 구성 요소를 설정하는 구성 요소 빌더를 소개합니다. 각 기능 모듈에서
  2. 빌드 타입을 확인하고 빌드 형식 = 에스프레소 다른 진정한 객체