在 Mockito 中,在连续调用非静态方法时 return 不同结果的正确方法是什么?
In Mockito, what's the proper way to return different results upon conseuctive calls to a non-static method?
我在 Java 中使用 Mockito 1.10.18 7. 如何在连续调用非静态方法时模拟不同的结果?我想模拟的调用的 API 看起来像
QueryResult query(String query)
所以我在我的 JUnit 测试中设置了模拟调用......
connection = Mockito.spy(connection);
ReflectionTestUtils.setField(m_regOrderItemDao, "connection", connection);
...
Mockito.when(connection.query(Mockito.anyString())).thenReturn(queryResults1, queryResults2);
虽然我可以看到 "connection" 是 "com.sforce.soap.enterprise.EnterpriseConnection$$EnhancerByMockitoWithCGLIB$11e13c@62e8ef9f" 类型(因此它被正确地转换为模拟),但上面导致了异常 ...
[MalformedQueryFault [ApiQueryFault [ApiFault exceptionCode='MALFORMED_QUERY'
exceptionMessage='SOQL statements cannot be empty or null'
extendedErrorDetails='{[0]}'
]
row='-1'
column='-1'
]
]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
就好像
connection.query(Mockito.anyString())
不知何故被真正处决了。什么是正确(和简单)的设置方式,使我的模拟 returns 在每次连续调用时都能得到正确的结果?
Mockito.when(connection.query(Mockito.anyString())).thenReturn(queryResults1).thenReturn(queryResults2);
因为您不想执行查询,所以您应该使用这种格式
doReturn(...).when(..).
Mockito.doReturn(queryResults1).doReturn(queryResults2).when(connection).query(Mockito.anyString())
如果你mock这个对象,上面的语句没有区别。但是如果你使用 spy,When(...).thenReturn() 将在返回之前先调用真正的方法。所以在这种情况下你应该使用 doReturn(...).when(..)。
更多相关信息 here
我在 Java 中使用 Mockito 1.10.18 7. 如何在连续调用非静态方法时模拟不同的结果?我想模拟的调用的 API 看起来像
QueryResult query(String query)
所以我在我的 JUnit 测试中设置了模拟调用......
connection = Mockito.spy(connection);
ReflectionTestUtils.setField(m_regOrderItemDao, "connection", connection);
...
Mockito.when(connection.query(Mockito.anyString())).thenReturn(queryResults1, queryResults2);
虽然我可以看到 "connection" 是 "com.sforce.soap.enterprise.EnterpriseConnection$$EnhancerByMockitoWithCGLIB$11e13c@62e8ef9f" 类型(因此它被正确地转换为模拟),但上面导致了异常 ...
[MalformedQueryFault [ApiQueryFault [ApiFault exceptionCode='MALFORMED_QUERY'
exceptionMessage='SOQL statements cannot be empty or null'
extendedErrorDetails='{[0]}'
]
row='-1'
column='-1'
]
]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
就好像
connection.query(Mockito.anyString())
不知何故被真正处决了。什么是正确(和简单)的设置方式,使我的模拟 returns 在每次连续调用时都能得到正确的结果?
Mockito.when(connection.query(Mockito.anyString())).thenReturn(queryResults1).thenReturn(queryResults2);
因为您不想执行查询,所以您应该使用这种格式 doReturn(...).when(..).
Mockito.doReturn(queryResults1).doReturn(queryResults2).when(connection).query(Mockito.anyString())
如果你mock这个对象,上面的语句没有区别。但是如果你使用 spy,When(...).thenReturn() 将在返回之前先调用真正的方法。所以在这种情况下你应该使用 doReturn(...).when(..)。
更多相关信息 here