可以模拟完整的方法吗?或者我是否必须在该方法中模拟每个服务调用?
这是一个(愚蠢的)例子:
class Foo {
void update() {
service1.do();
service2.do();
//...
}
}
class Bar extends Foo {
void save() {
super.update();
// doSometing that I want to test.
}
}
我想测试Bar.save(),我想模拟super.update()中的所有内容,而不必模拟每个服务本身。那可能吗?
答案 0 :(得分:2)
你的Bar课程是一个Foo。 Bar继承了Foo的更新方法。所以你不应该从被测试的类中嘲笑这个方法。选择其中一个更好:
答案 1 :(得分:1)
在你的情况下,Bar似乎延伸了Foo。
因为使用框架模拟它更加困难,但你可以在测试中覆盖update():
Bar testBar = new Bar() {
@Override
void update() {
// do nothing
}
}
assertSomething(bar.save());
但是...... @smas是对的,需要这样做就是代码气味,这表明你应该将is-a打破成has-a关系,然后嘲笑将是一件轻而易举的事:
class Bar {
private Foo foo;
public Bar(Foo foo) {
this.foo = foo;
}
void save() {
foo.update();
}
}
你的考试:
Bar bar = new Bar(mock(Foo));
assertSomething(bar.update());