【问题标题】:JUnit test - asset or verify (or both) on a mock object?JUnit 测试 - 模拟对象上的资产或验证(或两者)?
【发布时间】:2017-06-07 12:51:26
【问题描述】:

我正在为我在代码中定义的一些 bean 编写 JUnit 测试,以便通过 java 注释了解 spring 配置。测试代码如下:

public class FooTest {

    @MockBean
    private Baz baz; //injected

    @MockBean
    private Qux qux; //injected

    public void testBar() {
        Foo foo = new Foo(baz);
        Qux reponse = foo.bar();
        // verify or assert?
    }

}

其他类是这样定义的:

@Component
class Foo {

    Baz baz;

    @Autowired
    Foo(Baz baz) {
        this.baz = baz
    }

    Qux bar() {
        baz.waldo();
        baz.fred();
        return baz.newQux();
    }
}

@Component
class Baz {
    //...
}

正如您在我的 JUnit 测试中看到的那样,我从 FooTest 类中的模拟 Qux bean 返回了一个 Qux 响应。这让我开始考虑在Foo 类中测试bar 方法。我在这里看到了 3 个选项,想知道什么是最佳做法?

  1. FooTest 中的qux 实例变量上的testBar 测试方法response 上执行assertEquals。
  2. 执行上述操作,但还要在FooTest 中的baz 实例上执行waldofredfred 吗?还是这些验证调用是多余的,因为返回了 baz,我假设它们被调用了?
  3. 做 1 和 2?

【问题讨论】:

    标签: java spring unit-testing junit


    【解决方案1】:

    如果有可能做到断言,那就去做吧。在这种情况下,您将检查方法在调用后返回的实际值。

    Verify 只检查该方法是否被调用。当您调用某个方法并且想要检查内部是否调用了另一个方法时,这会更有用,但是您无法根据返回对象来执行此操作。在您的情况下,您返回整个对象,因此,从我的角度来看,您应该能够使用断言。

    【讨论】:

      【解决方案2】:

      首先,您需要定义执行这些语句时会发生什么。

       baz.waldo();  
       baz.fred();  
       baz.newQux();
      

      因为 baz 是一个模拟。

      其次,您必须进行验证以确保调用所有方法。你也可以断言。但首先您需要定义在调用baz.newQux() 时必须返回的内容。并检查foo.bar() 的响应是否与您定义的相同。

      【讨论】:

        猜你喜欢
        • 2018-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-18
        • 1970-01-01
        • 2014-02-11
        • 1970-01-01
        相关资源
        最近更新 更多