如何模拟完整的方法?

3

是否有可能模拟整个方法?或者我必须模拟该方法内的每个单独服务调用?

以下是一个(愚蠢的)示例:

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


1
看起来 Bar 应该继承 Foo,但是你的代码没有显示出来 - 这是正确的吗? - Romski
你在使用哪个库进行模拟? - evgenyl
是的,正确的。到目前为止我没有使用任何库,只是普通的JUnit4测试。 - membersound
2个回答

2
你的 Bar 类是一个 Foo。Bar 继承了 Foo 的 update 方法。所以你不应该对被测试类中的这个方法进行模拟。以下是更好的选择:
  • 考虑使用组合,这样模拟就会自然一些。
  • 从 FooTest 继承。你已经为 Foo 编写了测试,对吧?你可以重用其中的 @Before 设置,其已经模拟了所有服务。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接