JUnit测试 - 模拟对象上的资产或验证(或两者)?

时间:2017-06-07 12:51:27

标签: java spring unit-testing junit

我正在为我在代码中定义的一些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测试中看到的,我从Qux类中的模拟Qux bean返回FooTest响应。它让我考虑在类bar中测试Foo方法。我在这里看到3个选项,并想知道什么是最佳实践?

  1. responsetestBar实例变量的qux测试方法FooTest执行assertEquals。
  2. 执行上述操作但在verify baz上的FooTest实例waldo上也fred进行了baz或者这些验证调用是多余的,因为返回{name: '12.1.2011', series1: 4000, series2: 2400, series3: 2400}, {name: '12.2.2011', series1: 3000, series2: 1398, series3: 2210}, {name: '12.3.2011', series1: 2000, series2: 9800, series3: 2290} ,我认为它们被调用了?
  3. 做1和2?

2 个答案:

答案 0 :(得分:1)

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

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

因为巴兹是个嘲笑者。

其次,您必须进行验证以确保调用所有方法。你也可以做断言。但首先,您需要定义在调用baz.newQux()时必须重新调整的内容。如果这与您定义的内容相同,请检查foo.bar()的响应。

答案 1 :(得分:1)

如果有可能执行 Assert ,请执行此操作。在这种情况下,您将检查方法在调用后返回的实际值。

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