Java Mockito:如何动态设置thenReturn()?

Java Mockito:如何动态设置thenReturn()?,java,mocking,mockito,Java,Mocking,Mockito,我有一个接受项目列表的方法。我希望mock方法返回相同大小的对应列表(即list) 更一般地说,是否可以针对给定的输入动态设置返回值 问题是我对同一种方法有多个测试。测试A用于空列表,测试B用于包含多个对象的列表。然而,我只有一个@Before方法。您可以使用,可能与an结合使用来实现这一点 但是真正的答案是:考虑不要那样做。< /P> 单元测试应该是直接的。当某个测试失败时,您可以快速查看单元测试,并且已经知道在生产代码中查找哪里可以找到根本原因。任何增加测试复杂性的事情都可能使测试更加困难

我有一个接受项目列表的方法。我希望mock方法返回相同大小的对应列表(即
list

更一般地说,是否可以针对给定的输入动态设置返回值

问题是我对同一种方法有多个测试。测试A用于空列表,测试B用于包含多个对象的列表。然而,我只有一个
@Before
方法。

您可以使用,可能与an结合使用来实现这一点

但是真正的答案是:考虑不要那样做。< /P> 单元测试应该是直接的。当某个测试失败时,您可以快速查看单元测试,并且已经知道在生产代码中查找哪里可以找到根本原因。任何增加测试复杂性的事情都可能使测试更加困难


换言之:与其想出给出动态结果的复杂测试代码。。。而是编写多个简单的测试。您可以控制测试中的内容。因此,当您希望测试接收2、3、5个参数时,您需要为每种情况返回2、3、5个元素:然后编写3个不同的测试。

好的,正确的方法是:

import org.mockito.AdditionalAnswers;
String[] logEntry = // Some initialization code
List<String> logEntryList = Arrays.asList(logEntry); 
when(tuple.getString(1)).thenAnswer(AdditionalAnswers.returnsElementsOf(logEntryList));
import org.mockito.AdditionalAnswers;
String[]logEntry=//一些初始化代码
List logEntryList=Arrays.asList(logEntry);
when(tuple.getString(1)).thenAnswer(AdditionalAnswers.returnsElementsOf(logEntryList));
每次调用时,都会返回logEntry数组的连续元素。因此,第i次调用
tuple.getString(1)
将返回logEntry数组的第i个元素

注意:
returnsElementsOf
文档中的示例(截至本文撰写时)未更新(它仍然使用
returnsElementsOf
示例):

编辑:Javadoc现在已更新:

我明白了,也许我把它复杂化了。我知道每次测试返回时,我都会定义一个临时测试。谢谢@非常欢迎yaseco,我很高兴这个“非答案”对您有所帮助!