【问题标题】:Mockito test failed [closed]Mockito 测试失败 [关闭]
【发布时间】:2017-08-23 08:15:58
【问题描述】:

我的测试失败了,但真正的代码运行良好。 我有两个简单的类:

public class BarTest {
    private Bar bar;
    private Food food;

    @Test
    public void checkSizeFood (){
        bar = mock(Bar.class);
        food = mock(Food.class);
        bar.addFood(food);
        assertThat(bar.getsizeBar(),is(1)); //here failed
    }
}

【问题讨论】:

标签: java unit-testing mocking mockito


【解决方案1】:

bar 是一个模拟。调用 addFood 实际上不会对对象的状态做任何事情,因为它不是“真实的”Bar 实例。如果你想测试Bar 的功能,你应该使用真实的对象,而不是模拟:

bar = new Bar();
food = mock(Food.class);
bar.addFood(food);
assertThat(bar.getsizeBar(), is(1));

【讨论】:

  • 不懂idea模拟对象(什么时候需要?
  • @Mariia 通常我们在想要测试一些具有依赖关系的类时使用模拟,因此您可以模拟该依赖关系并测试类本身。
【解决方案2】:

您似乎了解如何使用模拟进行单元测试。

重点是:您模拟您的被测类需要完成其工作的东西。准确地说:当你的被测类调用你必须控制的东西时,你创建一个该类的模拟实例并使用它来构造那个被测对象您稍后会调用一个方法。

因此,类调用BarTest 模拟 Bar 的实例是没有意义的。

在你的情况下,测试用例应该(很可能!)阅读:

Bar underTest = new Bar();
bar.add(new Foo());
assertThat(bar.getSize(), is(1));

请注意:

  • 只有在绝对必要时才能模拟对象——所以当你可以在单元测试中使用new 创建一个Foo 对象时——那么就这样做。当然,如果add() 调用该 Foo 对象上的方法,情况会有所不同。但首先这个方法不应该被称为add()
  • 继续命名:该方法应命名为getSize() - 而不是getsizeBar():将类名放入方法名中没有意义,并且方法名采用驼峰命名法,而不是驼峰命名法。

长话短说:您似乎想通过反复试验来学习模拟/单元测试。这是一种无效的方法 - 在将它们放入代码之前,您必须了解 概念。因此:首先开始阅读一本好书或教程(例如one)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多