私はクラス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));
}
}
これはめちゃくちゃクールですか、それとも何ですか?