【问题标题】:Unit testing Collection in JavaJava中的单元测试集合
【发布时间】: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


【解决方案1】:

你确定你已经用 MockitoAnnotations.initMocks 初始化了模拟吗?

【讨论】:

  • 我使用 Assert 主要是出于习惯。不过,我一定会编辑它。至于验证,我知道我已经初始化了我需要的所有模拟对象。另外,@Mock注解是不是和Mockito.initmocks达到一样的效果?
  • 原始答案中的名称有误。该方法是 MockitoAnnotations.initMocks。是的,它必须从 Javadoc 中调用:“为给定的 testClass 初始化使用 Mock-annotation 注释的对象。”。
  • 我没有使用 Mockitoannotation.initMocks 方法,而是使用了@RunWith( MockitoJUnitRunner ),它也有效。
  • 是的,这是另一种初始化模拟的方式。
猜你喜欢
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 2014-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多