Junit 在莫基托,什么';在对非静态方法进行连续调用时,返回不同结果的正确方法是什么?
我将Mockito 1.10.18与Java7一起使用。如何在连续调用非静态方法时模拟不同的结果?我要模拟的调用的API如下所示Junit 在莫基托,什么';在对非静态方法进行连续调用时,返回不同结果的正确方法是什么?,junit,mockito,java-7,spy,Junit,Mockito,Java 7,Spy,我将Mockito 1.10.18与Java7一起使用。如何在连续调用非静态方法时模拟不同的结果?我要模拟的调用的API如下所示 QueryResult query(String query) 所以我在JUnit测试中设置了模拟调用,就像这样 connection = Mockito.spy(connection); ReflectionTestUtils.setField(m_regOrderItemDao, "connection", connection); ... Mo
QueryResult query(String query)
所以我在JUnit测试中设置了模拟调用,就像这样
connection = Mockito.spy(connection);
ReflectionTestUtils.setField(m_regOrderItemDao, "connection", connection);
...
Mockito.when(connection.query(Mockito.anyString())).thenReturn(queryResults1, queryResults2);
虽然我可以看到“连接”的类型是“com.sforce.soap.enterprise.EnterpriseConnection$$EnhancerByMockitoWithCGLIB”$$8011e13c@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())
真的被处决了。什么是正确的(简单的)设置方法,以便我的模拟在每次连续调用时返回正确的结果
Mockito.when(connection.query(Mockito.anyString())).thenReturn(queryResults1).thenReturn(queryResults2);
由于您不希望执行查询,因此应使用此格式
doReturn(…)。当(…)
如果您模拟该项目,则上述语句之间没有区别。但是如果您使用的是spy,那么(…).thenReturn()将在返回之前首先调用real方法。所以您应该使用doReturn(…)。在本例中(…)时。更多关于它的信息会导致相同的错误。不确定您是否看到了我的问题中关于语句的“connection.query(Mockito.anyString())”部分的抱怨部分。在您的解决方案中,它仍然抱怨相同的部分。虽然堆栈溢出时只接受代码回答,但建议添加一些解释。[即使是前言“此代码应该有效”看起来也要好得多。
doReturn
就在这里。因为when(connection)
首先单独发生,Mockito有时间禁用对realquery
方法的调用。
Mockito.doReturn(queryResults1).doReturn(queryResults2).when(connection).query(Mockito.anyString())