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

Java JUnit测试-模拟对象上的资产或验证(或两者)?,java,spring,unit-testing,junit,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 r

我正在为我在代码中定义的一些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 {
    //...
}
其他类别的定义如下:

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个选项,我想知道什么是最佳实践

  • 对测试方法
    testBar
    中的
    响应
    FooTest
    中的
    qux
    实例变量进行assertEquals
  • FooTest
    中的
    baz
    实例上执行上述操作,但也执行
    验证
    是否也调用了
    waldo
    fred
    ?或者这些验证调用是多余的,因为返回了
    baz
    ,我假设它们被调用了
  • 你喜欢1和2吗

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

     baz.waldo();  
     baz.fred();  
     baz.newQux();
    
    因为巴兹是个骗子


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

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

     baz.waldo();  
     baz.fred();  
     baz.newQux();
    
    因为巴兹是个骗子


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

    如果有可能执行断言,请执行。在本例中,您将检查方法调用后返回的实际值


    仅验证检查是否调用了该方法。当您调用某个方法并希望检查是否在内部调用了另一个方法,但无法基于返回对象执行此操作时,这会更有用。在您的例子中,您返回整个对象,因此,从我的角度来看,您应该能够使用assert。

    如果有可能使用assert,那么就使用assert。在本例中,您将检查方法调用后返回的实际值

    仅验证检查是否调用了该方法。当您调用某个方法并希望检查是否在内部调用了另一个方法,但无法基于返回对象执行此操作时,这会更有用。在您的例子中,您返回整个对象,因此,从我的角度来看,您应该能够使用assert