gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:07:14 26 4
gpt4 key购买 nike

尝试对使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com