Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.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
Java Multiple thenReturn在Mockito中工作不正常_Java_Unit Testing_Mocking_Mockito - Fatal编程技术网

Java Multiple thenReturn在Mockito中工作不正常

Java Multiple thenReturn在Mockito中工作不正常,java,unit-testing,mocking,mockito,Java,Unit Testing,Mocking,Mockito,我正在测试一个调用同一方法(db.getData())两次的方法。但我必须返回两个不同的值 Mockito.when(db.someMethod()).thenReturn(valueOne).thenReturn(valueTwo); 然后我尝试了多个thenReturn() 不幸的是,对于第一个和第二个db.getData()方法调用,我只得到了valueTwo。您没有显示太多上下文,但这里有一些想法: 确保db确实是一个模拟对象 使用调试器检查db.someMethod(

我正在测试一个调用同一方法(
db.getData()
)两次的方法。但我必须返回两个不同的值

       Mockito.when(db.someMethod()).thenReturn(valueOne).thenReturn(valueTwo);
然后我尝试了多个
thenReturn()


不幸的是,对于第一个和第二个
db.getData()
方法调用,我只得到了valueTwo。

您没有显示太多上下文,但这里有一些想法:

  • 确保db确实是一个模拟对象
  • 使用调试器检查db.someMethod()是否按预期调用了两次
  • 您还可以使用
    thenReturn(valueOne,valueTwo)虽然这不会有什么区别
我怀疑您的方法被调用了两次以上,并且您缺少第一次调用(返回valueOne),而只查看后续调用(所有调用都将返回valueTwo)

见:


可能是您正在调试,当您想要获取断点行的数据时,您正在从mock获取数据,因此它将返回其中一个
thenReturn()
参数,因此当您恢复测试时,它将使用第二个参数对其进行测试


如果您怀疑它是否正常工作,我建议您一次性获取所有
thenReturn()
项,在您同意它们正常后,再次开始测试,不跟踪
thenReturn()
项。

如果您希望它为不同的调用返回两个不同的值,您可以这样做:Mockito.when(db.someMethod()).thenReturn(valueOne);db.someMethod();Mockito.when(db.someMethod()).thenReturn(valueTwo);db.someMethod();@PiotrPytlik这不正确,请参阅::“您可以为连续的方法调用设置不同的行为。最后一次存根(例如:thenReturn(“foo”))确定后续连续调用的行为。”“@Adrian抱歉,又超越了我自己。是的,我错了……我在创建valueOne和valueTwo(实际上是一个复杂的对象)时犯了一些错误。然后返回(valueOne,valueTwo)&然后返回(valueOne)。然后返回(valueTwo)它们都正常工作。
 //you can set different behavior for consecutive method calls.
 //Last stubbing (e.g: thenReturn("foo")) determines the behavior of further consecutive calls.
 when(mock.someMethod("some arg"))
  .thenThrow(new RuntimeException())
  .thenReturn("foo");