Java JUnit测试-模拟对象上的资产或验证(或两者)?
我正在为我在代码中定义的一些bean编写JUnit测试,以便通过java注释了解spring配置。测试代码如下所示: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
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
,我假设它们被调用了
首先,您需要定义执行这些语句时会发生什么
baz.waldo();
baz.fred();
baz.newQux();
因为巴兹是个骗子
其次,您必须进行验证以确保所有方法都被调用。你也可以做断言。但首先需要定义调用
baz.newQux()
时必须返回的内容。并检查foo.bar()
的响应是否与您定义的相同。首先,您需要定义执行这些语句时会发生什么
baz.waldo();
baz.fred();
baz.newQux();
因为巴兹是个骗子
其次,您必须进行验证以确保所有方法都被调用。你也可以做断言。但首先需要定义调用
baz.newQux()
时必须返回的内容。并检查foo.bar()
的响应,如果这与您定义的相同。如果有可能执行断言,请执行。在本例中,您将检查方法调用后返回的实际值
仅验证检查是否调用了该方法。当您调用某个方法并希望检查是否在内部调用了另一个方法,但无法基于返回对象执行此操作时,这会更有用。在您的例子中,您返回整个对象,因此,从我的角度来看,您应该能够使用assert。如果有可能使用assert,那么就使用assert。在本例中,您将检查方法调用后返回的实际值 仅验证检查是否调用了该方法。当您调用某个方法并希望检查是否在内部调用了另一个方法,但无法基于返回对象执行此操作时,这会更有用。在您的例子中,您返回整个对象,因此,从我的角度来看,您应该能够使用assert