Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Junit 在莫基托,什么';在对非静态方法进行连续调用时,返回不同结果的正确方法是什么?_Junit_Mockito_Java 7_Spy - Fatal编程技术网

Junit 在莫基托,什么';在对非静态方法进行连续调用时,返回不同结果的正确方法是什么?

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

我将Mockito 1.10.18与Java7一起使用。如何在连续调用非静态方法时模拟不同的结果?我要模拟的调用的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);
虽然我可以看到“连接”的类型是“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有时间禁用对real
query
方法的调用。
Mockito.doReturn(queryResults1).doReturn(queryResults2).when(connection).query(Mockito.anyString())