如何模拟完整的方法?

时间:2013-03-24 12:40:14

标签: java junit mocking

可以模拟完整的方法吗?或者我是否必须在该方法中模拟每个服务调用?

这是一个(愚蠢的)例子:

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()中的所有内容,而不必模拟每个服务本身。那可能吗?

2 个答案:

答案 0 :(得分:2)

你的Bar课程是一个Foo。 Bar继承了Foo的更新方法。所以你不应该从被测试的类中嘲笑这个方法。选择其中一个更好:

  • 考虑使用合成,那么模仿它就是很自然的方式。
  • 从FooTest继承。你有Foo测试,对吧?你有@Before设置模拟那里的所有服务。重复使用它。

答案 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());