【问题标题】:How the unit test for the void method should look like?void 方法的单元测试应该是什么样子?
【发布时间】:2019-09-05 17:42:05
【问题描述】:

我编写了模拟商店购物篮的程序。用户能够从篮子中添加和删除项目。现在,我想知道我的(void)方法的单元测试应该是什么样子。我正在使用 JUnit 4。

我尝试更改我的addItem 方法以返回布尔类型,而不是什么都不返回。这样我就可以写出简单的Assert.assertTrue(basket.add...)。但是我不知道,void方法的单元测试应该怎么写。

public boolean addItem(Item item) {
    if (orderedItems.containsKey(item)) {
        Integer currItemCount = orderedItems.get(item);
        orderedItems.replace(item, currItemCount, currItemCount + 1);
        return true;
    } else {
        orderedItems.put(item, 1);
        return true;
    }
}

public void addItem(Item item) {
    if (orderedItems.containsKey(item)) {
        Integer currItemCount = orderedItems.get(item);
        orderedItems.replace(item, currItemCount, currItemCount + 1);
    } else {
        orderedItems.put(item, 1);
    }
}

【问题讨论】:

  • 欢迎来到 SO!没有看到你的整个班级很难判断,但你能不能只做basket.addItem(...);,然后在另一行测试你期望改变的条件,Assert.assertEquals(basket.size(), someNewQuantityYouExpected)和/或Assert.assertTrue(basket.contains(newItemYouAdded));等。
  • 在测试时如何创建orderedItems 映射?这取决于orderedItems 的创建方式。您可以验证/断言orderedItems 中的值。

标签: java unit-testing testing junit


【解决方案1】:

请注意,布尔值在您的第一个版本中是无用的,因为它总是返回 true。此外,添加一个布尔值并不能帮助您对代码进行单元测试,因为它太浅了。 所以你应该坚持你原来的想法(没有布尔值)。

关于您的问题:是的,addItem() 方法不会返回任何内容,但如果您可以在篮子中添加项目,您很可能也想阅读它们。
测试add() 的最简单方法是依赖get()/find() 方法。
而反过来。

你可以写这样的东西来测试篮子里不存在的物品:

@Test
public void addItem_given_item_not_present_then_getAll_retrieves_it() {
   basket.addItem(new Item("foo"));
   Map<Item, Integer> items = basket.getAll();
   // assert items contains 1 element with 1 occurrence and with the foo name
}

您当然应该编写其他测试场景。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    相关资源
    最近更新 更多