2017-04-06 20 views
1

에스프레소를 사용하여 ContentProvider을 사용하여 검색된 데이터를 표시하는 Activity을 테스트하고 있습니다.Espresso를 사용하여 Android 활동을 테스트 할 때 MockContentResolver를 어떻게 사용합니까?

MockContentProviderMockContentResolver을 사용하여 콘텐츠 제공 업체를 조롱하고 싶습니다. 그러나 활동 방법을 만드는 방법을 모르겠습니다. getContentResolver() 모의 해결 프로그램을 반환합니다.

(I 테스트를 실행하기 전에 데이터를 삽입 할 수 있지만, 대신 모의 제공자 사용할 수 있다면 내가 알고 싶습니다)

가 업데이트 : 난 아직도 만들 수 없습니다 작동을, 그래서 더 명확하게하려고 몇 가지 코드가 포함되어 있습니다.

MyActivity.java

MyActivity extends AppCompatActivity { 

    ... 

    private delete(String id) { 
     // The method getContentResolver() is what I want to mock when testing 
     getContentResolver().delete(
      Contract.Item.makeUriForItem(id), null, null); 
    } 

    ... 

} 

내가 getContentResolver()가 안드로이드에 의해 구현되고, 내가 주입 @Inject를 사용할 수 없기 때문에 제안이 일을 Dagger2를 사용하여 만들 수 없습니다

@RunWith(AndroidJUnit4.class) 
@LargeTest 
public class StockChartDetailsActivityTests { 

    @Rule 
    public ActivityTestRule<MyActivity> myActivityTestRule = new ActivityTestRule<MyActivity>(
     MainActivity.class); 

    @Test 
    public void test() { 

    } 

} 

MyActivityTests.java 내 ContentResolver.

나는 다른 전략을 사용할 수

  • 삽입 데이터를 데이터베이스에 테스트하기 전에.
  • 에는 비즈니스 로직 레이어와 같은 다른 레이어가 있고이 레이어의 클래스에 getContentResolver()으로 통화를 이동 한 다음 비즈니스 로직 클래스를 삽입 (모의) 할 수 있습니다.

그러나 이러한 전략을 사용하기 전에 MockContentResolver을 사용할 수 있는지 알고 싶습니다.

+0

에 대해 살펴 here 수 있습니다. –

답변

2

종속성 삽입 프레임 워크를 사용해야합니다. 나는 안드로이드에 대해 좋은 선택이 Dagger 2이라고 생각한다.

대거를 사용하면 실제 콘텐츠 제공자 Activity을 삽입 할 수 있습니다. 액티비티에 뭔가를 주입하는 일반적인 방법은 필드 인젝션을 사용하는 것입니다 (액티비티의 생성자에서 직접 행동 할 수 없기 때문에 이것은 시스템에서 생성됩니다). 따라서 Application 클래스의 대거 모듈을 인스턴스화하고 Activity에서 가져 와서 직접 삽입 할 수 있습니다. 뭔가 같은 :

((MyApplication).getMyComponent()).inject(this); 

클래스 MyApplication 같은 것을 포함합니다 :

MyComponent mMyComponent = DaggerMyComponent.builder() 
       .appModule(new AppModule(this)) // this is in general useful if you need a Context 
       .contentProviderModule(new ContentProviderModule()) 
       .build(); 

을 그리고 모듈 복귀 물론 getMyComponent() 방법을 포함한다 : 이제

MyComponent getMyComponent() { 
    return mMyComponent; 
} 

, 즉 당신의 모듈이 외부에서 당신의 Activity에 주입되면, 테스트 목적을 위해 다른 것을 쉽게 주입 할 수 있습니다 :

클래스의 동일한 경로를 사용하는/test/폴더에서 을 확장하는 새로운 클래스를 만들고 ContentProvider의 조롱 된 버전을 전달하는 모듈을 만들 수 있습니다.

나는 모든 단계를 통해 갈 수 있지만, 당신은 당신의 질문 코드 예제를 기입하십시오 자세한 내용

+0

Chiu-ki Chan의 작품을 확인하십시오. 그녀는 Mockito를 사용하고 사용자 모범 사례를 구현하여 모의 애플리케이션을 인스턴스화합니다. http://blog.sqisland.com/2015/04/dagger-2-espresso-2-mockito.html https://youtu.be/JlHJFZvZyxw?t=23m38s –

+0

Android 프레임 워크의 일부인 것을 삽입 할 수 있습니까? , @ GVillani82? 내가 모의하려고하는 것은 컨텍스트에서 getContentResolver() 메서드를 호출하여 액세스 할 수있는 ContentResolver입니다. –

+0

예, 컨텍스트가 필요합니다. 이것은 응용 프로그램 컨텍스트를 주입하는 다른 모듈 (AppModule)을 사용하도록 제안한 방법입니다. [Here] (https://github.com/codepath/android_guides/wiki/Dependency-Injection-with-Dagger-2)에서 구현을 찾을 수 있습니다. – GVillani82