通过 mockito 创建一个模拟列表

2022-09-01 04:28:25

我想创建一个模拟列表来测试下面的代码:

 for (String history : list) {
        //code here
    }

这是我的实现:

public static List<String> createList(List<String> mockedList) {

    List<String> list = mock(List.class);
    Iterator<String> iterHistory = mock(Iterator.class);

    OngoingStubbing<Boolean> osBoolean = when(iterHistory.hasNext());
    OngoingStubbing<String> osHistory = when(iterHistory.next());

    for (String history : mockedList) {

        osBoolean = osBoolean.thenReturn(true);
        osHistory = osHistory.thenReturn(history);
    }
    osBoolean = osBoolean.thenReturn(false);

    when(list.iterator()).thenReturn(iterHistory);

    return list;
}

但是当测试运行时,它会在行中引发异常:

OngoingStubbing<DyActionHistory> osHistory = when(iterHistory.next());

详细信息:

org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here:
-> at org.powermock.api.mockito.PowerMockito.when(PowerMockito.java:495)

E.g. thenReturn() may be missing.
Examples of correct stubbing:
    when(mock.isOk()).thenReturn(true);
    when(mock.isOk()).thenThrow(exception);
    doThrow(exception).when(mock).someVoidMethod();
Hints:
 1. missing thenReturn()
 2. you are trying to stub a final method, you naughty developer!

我该如何修复它?谢谢


答案 1

好吧,这是一件坏事。不要嘲笑列表;相反,模拟列表中的各个对象。请参阅 Mockito:模拟将在 for 循环中循环的数组列表,了解如何执行此操作。

另外,你为什么要使用PowerMock?你似乎没有做任何需要PowerMock的事情。

但是,问题的真正原因是,在完成存根之前,您正在两个不同的对象上使用。当您调用 时,并提供您尝试存根的方法调用,那么您在 Mockito 或 PowerMock 中执行的下一件事就是指定调用该方法时发生的情况 - 即执行该部分。在对 执行更多调用之前,必须后跟一个且只有一个调用 ,然后才能对 执行更多调用。您打了两个电话而没有打电话 - 这是您的错误。whenwhenthenReturnwhenthenReturnwhenwhenthenReturn


答案 2

在处理模拟列表和迭代它们时,我总是使用如下内容:

@Spy
private List<Object> parts = new ArrayList<>();

推荐