java - 如何使用 Mockito 模拟被调用两次且第二个方法调用的参数是第一个方法调用的输出的方法

标签 java unit-testing junit mockito

public List<Object> getDummyData(String testString ) {      
    final List<String> result1 = utility.getData(testString);
    final List<String> result2 = utility.getData(result1.get(0).split(~)[0]);       
    // Processing of result2 and few more method calls      
    return someListOfObject;
}

我需要模拟具有上述方法调用的方法。当我使用下面的代码时:

MainApp mock= Mockito.mock(MainApp.class);
List<String> mockList = Mockito.mock(ArrayList.class);
doReturn(mockList).when(mock).getData("str");

在第二个方法调用中运行测试用例时,我收到 IndexOutOfBoundsException。

最佳答案

该异常的原因是该行:

 utility.getData(result1.get(0).split(~)[0]);

您想要分割第一次调用的结果。 但您没有指定有关该模拟的任何内容!当您不指定任何内容时,当在该模拟上调用方法时,mockito 将仅返回虚拟/空/空数据。

而且你不必这样做。您绝对模拟列表对象。您只需创建一个适合您的测试的列表即可;喜欢

List<String> dummyList = Arrays.asList("whatever", "strings", "you need");

要说得非常清楚: mock 是你的最后手段。您使用它来控制您需要控制的对象;并且无法通过任何其他方式进行控制。

并且列表非常容易控制:通过创建一个包含您需要在该列表中的内容的列表。

问题的另一部分:您可以轻松地指示 Mockito 在重复调用同一方法时返回不同的结果;例如如图 here .

关于java - 如何使用 Mockito 模拟被调用两次且第二个方法调用的参数是第一个方法调用的输出的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43206285/

相关文章:

java - 通过删除中间接口(interface)(使用 ObjectAid 创建)来简化 UML 图

c# - 如何验证调用了一个方法?

javascript - 如何使用PayPal的SDK(Java或JavaScript)实现允许两步或更少步骤完成订单?

java - Java Swing 中奇怪的并发问题

java - 无法在 Eclipse 中将 Spark-Java 添加为 Maven 项目——不是原型(prototype)?

c# - 模拟 DirectoryEntry 的 "Properties"属性

android - 访问 Activity 的标准选项菜单

javascript - Junit GWT 错误 - 在对象 [对象窗口] 中找不到函数 attachEvent

java - test 和 src 目录/代码之间的差异在 test 文件夹中不起作用

java - 测试包括调用远程服务