Java Mockito/Realm(when-then):如何将参数从方法传递到其子方法
尝试对使用领域的项目进行单元测试。我截取了realm方法来测试我自己的代码,并发现RealmQuery有一个问题。我想测试一个对象是否被添加到领域数据库中;2个可以检索;3如果该对象的set属性与我期望的匹配。以下是我的部分设置和测试 如何在设置中存根域数据库someList是全局的&ListJava 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
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