在 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