Java Mockito/Realm(when-then):如何将参数从方法传递到其子方法

Java Mockito/Realm(when-then):如何将参数从方法传递到其子方法,java,android,mockito,realm,Java,Android,Mockito,Realm,尝试对使用领域的项目进行单元测试。我截取了realm方法来测试我自己的代码,并发现RealmQuery有一个问题。我想测试一个对象是否被添加到领域数据库中;2个可以检索;3如果该对象的set属性与我期望的匹配。以下是我的部分设置和测试 如何在设置中存根域数据库someList是全局的&List Answer findFirstAnswer = new Answer(){ @Override public Object answer(InvocationOnMock invoca

尝试对使用领域的项目进行单元测试。我截取了realm方法来测试我自己的代码,并发现RealmQuery有一个问题。我想测试一个对象是否被添加到领域数据库中;2个可以检索;3如果该对象的set属性与我期望的匹配。以下是我的部分设置和测试

如何在设置中存根域数据库someList是全局的&List

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
    }
}
如何在安装程序中存根RealmQuery搜索函数

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 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);
问题从这里开始。我需要一个真实的答案。相等于。。。将其参数传递给链中的下一个方法。我认为这是必要的,但我可能错了,因为我应该测试以下两种方法:findFirst和findAll。有什么想法吗

如何在安装程序中首先查找存根

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,例如CreateCount

@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属性包含什么

相反,我会问:你想测试什么?这不是一个对领域数据库库的测试,这是一件好事。在我看来,这几乎像是对莫基托的考验!如果测试成功,您将知道Mockito Mocks可以返回具有特定名称的对象

通常的做法是将数据层封装在非常薄的API中,类似于Spring等流行的数据访问对象。如果可以模拟数据API,就可以测试业务层。如果您的数据API需要测试,您还可以测试一些事情,例如此API调用是否转换为正确的查询?或者如果结果为空,API会崩溃吗


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

我仍然想知道是否有任何想法,但我刚刚创建了一个全局变量,用于为ID搜索分配int值。然后我在equalTo的答案中得到ID。你没有提到你正在使用哪个版本的领域。但是为了帮助Mockito用户,2.2.2版本将主要类更改为非最终类。我使用的是最新的领域版本。那会有什么帮助?我刚开始单元测试,所以我对mockito是新手@geisshirt