[英]Create a mocked list by mockito
我想创建一个模拟列表来测试下面的代码:
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!
我该如何解决? 谢谢
好的,这是一件坏事。 不要嘲笑一个清单; 相反,模拟列表中的各个对象。 请参阅Mockito:嘲笑一个arraylist,它将在for循环中循环以获取如何执行此操作。
另外,你为什么使用PowerMock? 您似乎没有做任何需要PowerMock的事情。
但是你的问题的真正原因是,你正在使用when
在两个不同的对象,在完成之前存根。 当你调用when
,并提供你试图存根的方法调用时,你在Mockito或PowerMock中做的下一件事就是指定在调用该方法时会发生什么 - 也就是说,执行thenReturn
部分。 每次调用when
必须跟随一次且只有一次调用thenReturn
,然后再调用when
。 你让两个调用when
无需调用thenReturn
-这是你的错误。
在处理模拟列表并迭代它们时,我总是使用类似的东西:
@Spy
private List<Object> parts = new ArrayList<>();
我们可以为foreach循环正确地模拟列表。 请在下面找到代码段和说明。
这是我的实际类方法,我想通过模拟列表创建测试用例。 this.nameList
是一个列表对象。
public void setOptions(){
// ....
for (String str : this.nameList) {
str = "-"+str;
}
// ....
}
foreach循环内部在迭代器上工作,所以这里我们创建了iterator的mock。 Mockito框架具有通过使用Mockito.when().thenReturn()
返回特定方法调用的值对的功能,即在hasNext()
我们传递1st true而在第二次调用false,因此我们的循环将仅继续两次。 在next()
我们只返回实际的返回值。
@Test
public void testSetOptions(){
// ...
Iterator<SampleFilter> itr = Mockito.mock(Iterator.class);
Mockito.when(itr.hasNext()).thenReturn(true, false);
Mockito.when(itr.next()).thenReturn(Mockito.any(String.class);
List mockNameList = Mockito.mock(List.class);
Mockito.when(mockNameList.iterator()).thenReturn(itr);
// ...
}
通过这种方式我们可以避免使用list的mock来发送实际列表进行测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.