2017-04-06 79 views
1

我正在使用Espresso測試Activity,顯示使用ContentProvider檢索到的數據。如何在使用Espresso測試Android活動時使用MockContentResolver?

我想模擬內容提供者使用MockContentProviderMockContentResolver,但我不知道如何使活動方法getContentResolver()返回一個模擬解析器。

(我可以執行測試之前插入數據,但我想知道是否可以使用,而不是一個模擬提供商)

更新: 我仍然不能使它工作,所以我包括一些代碼,試圖使其更清晰。

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); 
    } 

    ... 

} 

MyActivityTests.java

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

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

    @Test 
    public void test() { 

    } 

} 

我不能讓建議使用Dagger2工作,因爲getContentResolver()由機器人實現,我不能用@Inject注入我自己的ContentResolver。測試之前在數據庫

  • 插入數據:

    我可以使用不同的策略。

  • 有另一層,如業務邏輯層,並將調用getContentResolver()移動到此層中的類,然後我可以注入(和模擬)業務邏輯類。

但是在使用這些策略之前,我想知道是否可以使用MockContentResolver

+0

請在您的問題代碼示例。 –

回答

2

您應該使用依賴注入框架。我認爲對於Android來說,一個不錯的選擇是Dagger 2

使用匕首,你可以注入你的真實內容提供商Activity。在Activity中注入某些東西的常用方法是使用字段注入(因爲您不能直接在Activity的構造函數上執行操作:它是由系統創建的)。因此,您可以在Application類中實例化Dagger模塊,並從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; 
} 

現在,你的模塊從外部注入到你的活動中,你可以很容易地注入其他東西來進行測試:

在/ test /文件夾中並使用MyApplication類的相同路徑,可以創建一個新類,擴展MyApplication並創建傳遞模擬版本的ContentProvider的模塊。

我不能去完成所有的步驟,但你可以看看here更多細節

+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?我試圖模擬的是ContentResolver,我可以通過在上下文中調用方法getContentResolver()來訪問它。 –

+0

是的,你需要一個上下文。這就是我建議你使用注入應用程序上下文的另一個模塊(AppModule)。 [Here](https://github.com/codepath/android_guides/wiki/Dependency-Injection-with-Dagger-2)你可以找到它的實現 – GVillani82

相關問題