簡體   English   中英

Mockito / Realm(何時):如何將參數從方法傳遞到其子方法

[英]Mockito/Realm (when-then): how to pass arguments from method to its submethod

嘗試對使用Realm的項目進行單元測試。 我使用了領域方法來測試我自己的代碼,發現RealmQuery存在問題。 我想測試是否將對象(1)添加到Realm數據庫中; (2)可以取回; (3)如果該對象的set屬性符合我的期望。 這是我的setup()和Test的一部分。

我如何在setup()中存入領域數據庫(someList是全局&List <>)

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

我如何在setup()中存根復制到Realm(添加功能)

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

我如何在setup()中存根RealmQuery(搜索功能)

RealmQuery someRealmQuery = someRealmQuery(); //followed mockito example on github

when(mockRealm.where(SomeRealmObject.class)).thenReturn(someRealmQuery);
when(realmQuery.equalsTo(anyString, anyInt).thenReturn(someRealmQuery);
when(realmQuery.findFirst()).then(findFirstAnswer);

問題從這里開始。 我需要realmQuery.equalsTo(...)將其參數傳遞給鏈中的下一個方法。 我認為這是必要的(但我可能錯了),因為我應該測試以下兩個方法:findFirst()和findAll()。 有任何想法嗎?

我如何在setup()中存根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
    }
}

我如何對我的createSomeObject(例如createAccount)進行單元測試

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

這不是您問題的直接答案。 直接答案將涉及對findFirstAnswer是什么及其name屬性包含什么的討論。

相反,我會問:“您要測試什么”? 這不是對Realm數據庫庫的測試(很好)。 在我看來,這幾乎就像是對Mockito的測試! 如果測試成功,您將知道Mockito Mocks可以返回具有特定名稱的對象。

通常的做法是將數據層包裝在非常薄的API中,例如Spring流行的Data Access Objects之類。 如果可以模擬數據API,則可以測試業務層中的內容。 如果您的數據API需要測試,您還可以測試諸如“此API調用是否轉換為正確的查詢?”之類的東西。 或“如果結果為空,API是否會崩潰?”。

對不起,我的回答很抱歉,但是我認為,如果您重新考慮要測試的問題,則整個問題可能會消失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM