2017-02-03 1 views
0

レルムを使用するプロジェクトの単体テストを試みています。私は自分のコードをテストするためにレルムメソッドをスタブし、RealmQueryに問題があることを発見しました。オブジェクトが(1)レルム・データベースに追加されているかどうかをテストしたい。 (2)を取り出すことができる。 (3)そのオブジェクトのset属性が私が期待しているものと一致するかどうか。ここに私のsetup()とTestの部分があります。私は、セットアップ中にレルム(機能の追加)(へのコピーをスタブ方法Mockito/Realm(when-then):メソッドからそのサブメソッドへの引数の受け渡し方法

私はセットアップでレルムデータベースを(someListがグローバル&一覧<です>)(スタブ方法

SomeRealmObject some1; 
some1.setId(1); 
some1.setName("some1"); 

SomeRealmObject some2; 
some2.setId(2); 
some2.setName("some2"); 

someList = new ArrayList<SomeRealmObject>(); 
someList.add(some1); 
someList.add(some2); 

when(mockRealm.copyToRealm).then(new Answer() { 
     @Override 
     public Object answer(InvocationOnMock invocation) throws Throwable { 

      Object[] args = invocation.getArguments(); 

      SomeRealmObject some = (SomeRealmObject) args[0]; 

      userList.add(user); 

      return user; 
     } 
    }); 

セットアップ()でRealmQuery(検索機能)をスタブする方法

P荒れ果てがここから始まります。チェーンの次のメソッドに引数を渡すには、realmQuery.equalsTo(...)が必要です。 findFirst()とfindAll()の2つのメソッドをテストする必要があるので、必要だと思いますが、間違っている可能性があります。 すべてのアイデア? Iユニットは、私のcreateSomeObject(例えばcreateAccount)をテストどのようにセットアップでのFindFirstを()スタブ方法

()

Answer findFirstAnswer = new Answer(){ 

    @Override 
    public Object answer(InvocationOnMock invocation) throws Throwable { 

     Object[] args = invocation.getArguments(); 

     String key = args[0].toString(); //Let's just use an Id search for 
     int id = (int) args[1];   //an example. 

     for(int count = 0; someList.get(count) != null; count++){ 

      if(someList.get(count).getId == id){ 
      return someList.get(count); 
     } 

     return null; //test will fail, someRealmObject not found 
    } 
} 

@Test 
public void create_someObj_test() { 

    String expectedReturnedName = "someName"; 
    String actualReturnedName; 

    SomeRepositoryImpl manager; //Class with business logic (mvp pattern) 
    SomeRepositoryImpl.initialize(); 
    manager = someRepositoryImpl.getInstance(); 

    SomeRealmObject some = new SomeRealmObject(); 
    some.setID(6); 
    some.setName(expectedReturnedName); 

    //mock adding user to realm, should actually add it to a list 
    mockRealm.beginTransaction(); 
    mockRealm.copyToRealm(some); 
    mockRealm.commitTransaction(); 

    actualReturnedName = mockRealm.where(SomeRealmObject.class).equalTo("id", some.getId()).findFirst().getName().toString(); 

    //PASS if object exists and name matches 
    //FAIL if name does not match 
    //FAIL if nullPointerException because no match/object not found 
    assertEquals(expectedReturnedName, actualReturnedName); 
} 
+0

アイデアがあるかどうかは知りたいですが、ID検索にint値を割り当てるためのグローバル変数を作成したばかりです。私はその後、equalTo()の答えでIDを取得します。 –

+0

使用しているレルムのバージョンは言及していません。しかし、バージョン2.2.2では、Mockitoユーザーを支援するために、主要なクラスを非最終的に変更しました。 – geisshirt

+0

私は、最新のレルムバージョンを使用しています。どのように役立つだろうか?私はユニットテストを開始したので、私はmockitoを初めて使っています。 @geisshirt –

答えて

-1

これは、あなたの質問に直接答えではありません。直接回答には、findFirstAnswerの内容とそのnameの内容が含まれます。

代わりに、私は "あなたは何を試そうとしていますか"と尋ねるでしょう。これはRealm DBライブラリ(良いこと)のテストではありません。それは私にはほとんどMockitoのテストのように見えます!テストが成功すると、Mockito Mockは特定の名前のオブジェクトを返すことができます。

Springなどで一般的なデータアクセスオブジェクトのような非常に細いAPIにデータレイヤーをラップするのが一般的です。データAPIを模擬することができれば、あなたのビジネスレイヤーをテストすることができます。データAPIにテストが必要な場合は、「このAPI呼び出しが適切なクエリに変換されますか?」などの項目をテストすることもできます。または「結果が空の場合はAPIがクラッシュしますか?」

申し訳ありませんが、私はあなたがテストしようとしていることの問題を再訪すると、この全体の問題が蒸発する可能性があります。

関連する問題