4

したがって、A、B、C の 3 つのクラスがあります。 class の単体テストを作成する必要がありますA

  class A extends B{
   //fields go here ...

   public A(String string, ...){
      super.(string,...);
   }
   //other methods here ...
 }

 class B{
   C stuff;
   //other stuff
 }

重要Cなリソース (JDBC や ssh セッションなど) も同様です。当然、私は嘲笑してCいます。どうすればモックできますかB。ImagineBには、それを拡張する多くの子クラスがあります。

私の主な問題は、それAが呼び出すことsuper.(...)です。Aテストのためだけにメソッドを注入したくありません。私にとって、それは悪いデザインです。親を嘲笑する方法はありますか?

たとえば、との両方が の子になるclass MockB extends B{...}ためMockB obj = new A();、これは機能しません。MockBAB

4

2 に答える 2

10

テスト中のクラスのスーパークラスをモックしようとするべきではありません。一部のモック フレームワークでは、実際にテストしているクラスを部分的にモックできる「部分モック」を許可していますが、これは悪い考えです。

クラスと と の間のA関係が十分に複雑で、これが必要だと思われる場合、それらはおそらく継承関係にあるべきではありません。AB

コードを拡張するのではなく、Bデリゲートするようにコードを変更することを検討してください。A

于 2012-07-23T00:01:50.587 に答える
3

B クラスをモックしたいということは、おそらく B も A もテストしていないことを意味します。jdbcが呼び出すメソッドの数を知っていますか? しかし、あなたが言ったように、それを嘲笑しても問題ありません。こっちも一緒。あなたはただする

B mockOfB = Mockito.mock(B.class);

それでおしまい。B のモックがあり、好きな呼び出しをテストできます。

A をテストしている場合、単純にインスタンス化できないのはなぜですか? B のコンストラクターにはいくつかの静的依存関係が必要ですか? この場合、リファクタリングするか、powermock のようなものを使用する必要があります (本当にクラスをリファクタリングできない場合)。抽象的であるため B をインスタンス化できない場合は、テストで拡張するだけです

于 2012-07-22T23:47:33.620 に答える