我不知道如何使用mocks来检查我的方法是否每次都应该调用。我真的不知道如何描述这个问题,所以我会继续,只是显示我的代码:使用mocks检查每个对象在迭代期间是否被分析过
我有两个相互作用的类:Filter
和Filtrable
(一个接口)。 Filter
类可以过滤filtrables - 返回过滤器(因此如果需要,可以应用其他过滤器)。过滤方法只是迭代每条可过滤的行,并检查该行是否被过滤 - 如果过滤则添加结果过滤。我想测试每个输入行是否真的被检查。
下面是从Filter
类代码:
public Filtrable filter(Filtrable input) {
Filtrable result = input.createEmptyFiltrable();
while(input.hasNextLine()){
Line line = input.nextLine();
if(isLineFiltered(line)){
result.addLine(line);
}
}
return result;
}
这是我的(失败)的尝试,以测试它:这里
@Test
public void testFilter(){
Filtrable mockedFiltrable = mock(Filtrable.class);
when(mockedFiltrable.createEmptyFiltrable()).thenReturn(new StringArrayFiltrable());
when(mockedFiltrable.hasNextLine()).thenReturn(true,true,true,false);
when(mockedFiltrable.nextLine()).thenReturn(dummyLine);
Filter mockedFilter = mock(Filter.class);
mockedFilter.filter(mockedFiltrable);
verify(mockedFilter, times(3)).isLineFiltered(dummyLine);
}
当时的想法是做一个存根可滤,其中包括三个相同的虚拟线。然后将它们传递给Filter类并检查方法isLineFiltered
是否每次都使用相同的dummyLine调用三次。
阅读后由马丁福勒Mocks Aren't Stubs我明白这是完全错误的,因为我不测试实际系统(Filter
)在任何地方!
那么如何验证“System under Test”中的方法是否使用mock调用了三次?这是至关重要的,因为我正在尝试学习这种方法。我可以轻松地创建一个从Filter继承的测试类,并计算调用isLineFiltered
的次数,然后检查它。我只是觉得这可以通过模拟很好地完成。
我在这里使用Mockito,如果有任何建议也会使用它(但任何其他的Java嘲笑框架当然会这样做)会很好。
P.S.
我运行测试后,引发了Mockito Wanted but not invoked: filter.isLineFiltered
的异常。
编辑:
可滤界面如下:
public interface Filtrable {
public Filtrable createEmptyFiltrable();
public boolean hasNextLine();
public void addLine(Line line);
public Line nextLine() throws FiltrableException;
}
SOLUTION:
以下是我已经最终完成它:
@Test
public void testFilter(){
Filtrable mockedFiltrable = mock(Filtrable.class);
Filtrable mockedFiltrableResult = mock(Filtrable.class);
when(mockedFiltrable.createEmptyFiltrable()).thenReturn(mockedFiltrableResult);
Iterator<Line> mockedIterator = mock(Iterator.class);
when(mockedFiltrable.iterator()).thenReturn(mockedIterator);
when(mockedIterator.hasNext()).thenReturn(true,true,true,false);
when(mockedIterator.next()).thenReturn(dummyLine);
Filter filterUnderTest = new TestFilter(true);
filterUnderTest.filter(mockedFiltrable);
verify(mockedFiltrableResult,times(3)).addLine(dummyLine);
}
我已经改变了Filtrable接口来扩展Iterable,所以这就是为什么最终解决方案与我最初的尝试有点不同。
感谢您的帮助!
您是否也可以包含接口定义? – Jazzepi 2013-02-19 21:41:22