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()内のすべてをモックしたいと思います。それは可能ですか?

4

2 に答える 2

2

あなたのバークラスは-Fooです。BarはFooからupdateメソッドを継承しています。したがって、テスト対象のクラスのメソッドをモックするべきではありません。これの1つを選択することははるかによいです:

  • コンポジションの使用を検討してください。そうすれば、それをモックするのが自然な方法になります。
  • FooTestから継承します。Fooのテストがありますよね?そこにあるすべてのサービスをモックする@Beforeセットアップがあります。再利用してください。
于 2013-03-24T12:56:07.180 に答える
1

あなたの場合、BarはFooを拡張しているようです。

そのため、フレームワークでモックするのはより困難ですが、代わりにテストでupdate()をオーバーライドできます。

Bar testBar = new Bar() {
@Override
  void update() {
  // do nothing
  }
}

assertSomething(bar.save());

しかし...@smasは正しいです。このようにする必要があるのはコードの臭いです。これは、is-aをhas-の関係に分割する必要があることを示しています。そうすれば、モックが簡単になります。

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());
于 2013-03-24T12:46:41.177 に答える