【发布时间】:2015-07-31 18:19:53
【问题描述】:
我有一个单元测试,可以让我遍历包含车辆列表的 Collection 对象。在每次迭代中,我想检查车辆是否是汽车的实例。所以我的代码看起来有点像这样:
public class VehicleChecker {
protected boolean checkVehicles(Garage garage) {
for (Vehicle vehicle : garage.getVehicles() {
if (vehicle instanceof Automobile) return true;
}
}
}
所以我相应地编写了我的代码:
@Mock private Garage mockGarage;
@Mock private VehicleCollection mockVehicleCollection;
@Mock private VehicleCollectionIterator mockVehicleCollectionIterator;
@Mock private Vehicle mockVehicle;
@Test
public void testCheckVehicles() {
VehicleChecker testObject = new vehicleChecker();
when(mockGarage.getVehicles()).thenReturn(mockVehicleCollection);
when(mockVehicleCollection.iterator()).thenReturn(mockVehicleCollectionIterator);
when(mockVehicleCollectionIterator.hasNext()).thenReturn(true).thenReturn(false);
when(mockVehicleCollectionIterator.next()).thenReturn(mockVehicle);
boolean result = testObject.checkVehicles(mockGarage);
verify(mockGarage).getVehicles();
}
verify 语句出现问题。根据它的编写方式,测试应该通过。但是,当我单步执行代码时,代码只是完全跳过了 for 循环。这是为什么?与 ArrayList 相比,遍历 Collection 的方式有什么不同吗?如果是这样,我该如何正确地模拟这种交互?
【问题讨论】:
-
两个问题:为什么要手动检查类型?这通常是一个糟糕的设计。为什么要模拟这个系列而不是只给它一个真实的?
-
我正在努力处理该代码的特定版本,它没有返回类型并且不接受任何参数。这包括集合。我能做的最好的就是通过代理模拟集合。可以说,我无法提供实际的 Collection 对象。
-
刚刚尝试了整个过程,按预期工作,包括测试失败,因为您模拟了
Vehicle而不是Automobile。好的,有两个小错别字,但 IDE 不会突出显示。所以,奇怪的是,如果它不适合你。
标签: java unit-testing testing junit mockito