2017-01-24 8 views
4

私はAndroidでMockitoのテストを始めたばかりで、データソースメソッドのテスト方法を理解できていません。Mockitoを使ってアンドロイドでORMを正しくテストする方法は?

AndroidInitializeConfig config = new AndroidInitializeConfig(getApplicationContext()); 
List<Class<? extends Rush>> classes = new ArrayList<>(); 
classes.add(CardCollection.class); 
classes.add(Note.class); 
config.setClasses(classes); 
RushCore.initialize(config); 

マイデータソースクラスがこれです:私はアプリのApplicationクラスに初期化されRushOrmを使用

​​

これは、リポジトリのクラスのための私のテストクラスです:

@Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.LOLLIPOP, application = ProjectApplication.class) 
@RunWith(MockitoJUnitRunner.class) 
public class CollectionsRepositoryTest { 

    private CollectionPresenter presenter; 

    @Mock 
    private CollectionsRepository repository; 

    @Mock 
    private CollectionContract.View view; 

    @Mock 
    private CollectionDataSourceImplementation dataSource; 

    @Mock 
    private CollectionDataSource.GetCollectionCallback getCollectionCallback; 
    @Mock 
    private CollectionDataSource.LoadCollectionsCallback loadCollectionsCallback; 
    @Mock 
    private CollectionDataSource.SaveOrUpdateCollectionCallback saveOrUpdateCollectionCallback; 

    @Captor 
    private ArgumentCaptor<CollectionDataSource.GetCollectionCallback> getCollectionCallbackArgumentCaptor; 
    @Captor 
    private ArgumentCaptor<CollectionDataSource.LoadCollectionsCallback> loadCollectionsCallbackArgumentCaptor; 
    @Captor 
    private ArgumentCaptor<CollectionDataSource.SaveOrUpdateCollectionCallback> saveOrUpdateCollectionCallbackArgumentCaptor; 

    private static List<CardCollection> collections = Lists.newArrayList(new CardCollection("Title1", "Description1", null), 
      new CardCollection("Title2", "Description2", null)); 
    private final static String collection_title = "title"; 

    @Before 
    public void setUp() { 
     // Mockito has a very convenient way to inject mocks by using the @Mock annotation. To 
     // inject the mocks in the test the initMocks method needs to be called. 
     MockitoAnnotations.initMocks(this); 

     // Get a reference to the class under test 
     presenter = new CollectionPresenter(repository, view); 
    } 

    @Test 
    public void getCollections() { 
     dataSource.getCollections(loadCollectionsCallback); 
     verify(dataSource).getCollections(loadCollectionsCallbackArgumentCaptor.capture()); 
     loadCollectionsCallbackArgumentCaptor.getValue().onSuccess(collections); 
    } 

    @Test 
    public void getCollection() { 
     dataSource.getCollection(collection_title, getCollectionCallback); 
     verify(dataSource).getCollection(eq(collection_title), any(CollectionDataSourceImplementation.GetCollectionCallback.class)); 
    } 

    @Test 
    public void saveCollection() { 
     CardCollection collection = new CardCollection("Title", "Description", null); 
     dataSource.saveCollection(collection, saveOrUpdateCollectionCallback); 
     verify(dataSource).saveCollection(collection, saveOrUpdateCollectionCallbackArgumentCaptor.capture()); 

     saveOrUpdateCollectionCallbackArgumentCaptor.getValue().onSuccess(collection); 
    } 

    @Test 
    public void updateCollection() { 

    } 

    @Test 
    public void deleteCollection() { 

    } 

    @Test 
    public void deleteAllCollections() { 

    } 
} 

saveCollectionメソッドが失敗しています。私はグーグルで、主に直接sqlite接続をテストする方法を見つける。どんなアイデアも参考になるでしょう。ありがとうございました。

+0

こんにちは、あなたのテストの目標は何ですか?どの時点であなたは嘲笑していますか?私はMockitoについて多くの知識を持っていませんが、RushOrmがやっていることのお手伝いをすることができます。 –

+0

こんにちは、私は、アプリケーションからのRushOrmの操作が適切に動作していることをテストしたいと思います。 – user1140656

+1

実際にライブラリをテストする場合は、実際に何かを嘲笑したくはありません。標準のアンドロイドテストフレームワークを使用してテストすることができます。あなた自身のクラスを模擬したいかもしれませんが、あなたが実際にテストしたいものを嘲笑しているので、データソースのことを嘲笑したくないと思います。RushOrmにはたくさんのテストがあります。それらをチェックすると、あなたが始めるのに役立つでしょう。https://github.com/Stuart-campbell/RushOrm/tree/master/RushORM/rushandroid/src/androidTest/java/co/uk/rushorm/android –

答えて

3

あなたはユニットテストの間違ったを取得しているように見えます:どのようなあなたのメソッドがやっていることである

  • 試験方法は嘲笑オブジェクト
  • 上のメソッドを呼び出して、あなたは、「検証"嘲笑されたメソッドが呼び出されたこと

簡単に言えば:意味がありません。あなたはを模倣したオブジェクトをの生産コードに渡すという考えです。プロダクションコードで何らかの操作をトリガーします。そして最後に、あなたが見たいと思ったコールが本当に起こったことを確認します。

それ以上:ライブラリは、少なくとも単体テストではなさそうですが、テストしません。

代わりに、ユニットテストでは、配線でプロダクションがテストされている必要があります。言い換えれば、テストする必要があるのは、実動コードがいくつかのライブラリメソッド呼び出しに渡す引数が、期待されるものであるということだけです。

もちろん、すべての機能がエンドツーエンドで動作するように、「統合レベル」のテストを行う必要があります。しかし、それは一般にを超えて、ユニットテストの範囲を超えています(名前がすでにわかっているように!)

1

私はエラーがこの行であることができることを考える:あなたは別のパラメータを持つメソッドを検証することはできません

verify(dataSource).saveCollection(collection, saveOrUpdateCollectionCallback); 

:によって

verify(dataSource).saveCollection(collection, saveOrUpdateCollectionCallbackArgumentCaptor.capture()); 

変更。

関連する問題