6

私はクラスAを持っているとしましょう

class A {
  final String foo() {
    // .. computing result, contacting database, whatever ..
    return "some computed value";
  }
  // ... and a bazillion other methods, some of them final.
}

今、私はクラスBを持っています

class B {
  String methodIWantToTest(A a) {
      String output = a.foo();
      // ... whatever this method does, e.g.:
      output += "_suffix";
      return output;
  }
}

このメソッドの単体テストを行うにはどうすればよいですか? 最終的な理由foo()は、A を拡張するクラスでその機能を変更したくないからです。しかし、メソッドを真に単体テストすると同時に、実際のA.foo()メソッドに手を伸ばして実行したくありません。

たとえば、最後のキーワードを削除して、の行に沿って注釈を追加する方法はあり@finalUnlessTestますか? あなたは何をお勧めします?A をインターフェイスにリファクタリングすることは非常に困難です。なぜなら、それは私たちの中心的なクラスの 1 つであり、残念ながら非常に結合されているからです。

編集#1申し訳ありませんが、言及するのを忘れていました.Javaについて話している. 私たちはまだモッキング フレームワークを使用していません。

OK と答えてください。JMockitは信じられないほど素晴らしいものであり、私の目にはレガシー コードをテストするためのキラー アプリです。特に私の場合、信じられないほど便利です。本当にありがとう!基本的に、私の疑似例では次のようなことを行います。

class AMock {
   final String foo() {
     return "myTestValue";
   }
}
class Test extends TestCase {
   A mockedA;
   B b;
   protected void setUp() {
      Mockit.redefineMethods( A.class, AMock.class );  // this "pipes" all mocked methods from A to AMock
      mockedA = new A();    // NOT new AMock()!!!
      b = new B();
   }
   public void testB() {
      assertEquals("myTestValue",mockedA.foo());
      assertEquals("myTestValue_suffix",b.methodIWantToTest(mockedA));
   }
}

これはめちゃくちゃクールですか、それとも何ですか?

4

3 に答える 3

6

JMockitモッキング ライブラリを試すことができます。

于 2008-10-10T09:15:02.573 に答える
0

次のコードでもそれを行うことができます。これが良い習慣だと言っているわけではありませんが、匿名クラスの興味深い使い方 (悪用?) です。

public class Jobber {

    public final String foo() {
        return fooFactory() ;
    }

    String fooFactory() {
        return "jobber" ;
    }


    public static void main(String[] args) {

        Jobber jobber = new Jobber() { String fooFactory() { return "prefix " + super.fooFactory() ;} } ;

        System.out.println(jobber.foo() );
    }
}
于 2008-10-13T09:05:38.350 に答える
0

「最終」を削除して、「このメソッドをオーバーライドしないでください!!」というコメントを入れます。同僚が簡​​単な指示に従わないと信じられないのであれば、とにかく絶望的です。

于 2008-10-10T09:11:00.957 に答える