java - Mockito/Realm (何时-那么): how to pass arguments from method to its submethod

标签 java android mockito realm

尝试对使用 Realm 的项目进行单元测试。我对 Realm 方法进行 stub 测试以测试我自己的代码,并发现 RealmQuery 存在问题。我想测试一个对象是否(1)添加到 Realm 数据库中; (2)可检索; (3) 如果该对象的设置属性符合我的预期。这是我的 setup() 和测试的部分内容。

如何在 setup() 中 stub Realm 数据库(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() 中 stub 复制到 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() 中 stub 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() 中 stub 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 DB 库的测试(一件好事)。在我看来,这几乎就像是对 Mockito 的测试!如果测试成功,你就会知道Mockito Mocks可以返回一个具有特定名称的对象。

通常的做法是将数据层包装在一个非常薄的 API 中,例如 Spring 等流行的数据访问对象。如果您可以模拟数据 API,则可以测试业务层的功能。如果您的数据 API 需要测试,您还可以测试诸如“此 API 调用是否转换为正确的查询?”之类的内容。或“如果结果为空,API 会崩溃吗?”。

抱歉 oblique answer但我认为,如果您重新审视您要测试的内容的问题,整个问题可能会消失。

关于java - Mockito/Realm (何时-那么): how to pass arguments from method to its submethod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42014755/

相关文章:

java - 在单元测试 Controller 时模拟 Spring Validator

java - 如何使用 Mockito 模拟 ResultSet.next() 方法

java - 如何让struts2看到我的属性文件

android - Eclipse 在导入现有项目时覆盖现有项目文件

android - 如何在 Android Google map 上显示 map 图例?

java - Mockito - 注入(inject)模拟列表

java - Android:上传数据到服务器的进度条

java - Hibernate EJB 架构 - 模型 ClassNotFoundException

java - BufferedReader() 构造函数的参数是抽象类的对象

android - 如何在 iOS 项目中添加两个或多个 kotlin 原生模块