- PR -

テストケースについて

1
投稿者投稿内容
ナスティキャット
常連さん
会議室デビュー日: 2004/03/03
投稿数: 24
投稿日時: 2004-03-17 12:06
こんにちは。

最近はJAVAはJUnitを使ってテストをするのがあたりまえのようですね。
そこでJAVAのテストで少し質問したいのですが、単体テストとはその単体のみ作成しながらでもテストできるようにすることですよね?

そこで、メソッドごとにテストをしたいのですが、メソッドが次のように呼び出されるとします

クラス1のメソッドA → クラス1のメソッドB → クラス2のメソッド

この場合のテストで「クラス1のメソッドB→クラス2のメソッドC」の部分は
クラス1のモックオブジェクトにクラス2のモックオブジェクトを持たせると言う形を使って
メソッドBのみでテスト可能ですが、「メソッドA→メソッドB」の部分はどうしたらよいのでしょう?
「メソッドA→メソッドB」の部分をメソッドAのみの作成でテストができるようにするにはクラス1のモックオブジェクト作らないといけないように思います。
メソッドAのみでテストできる形にした方が良いのでしょうか?
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2004-03-17 12:42
すべてモックオブジェクトで処理するのではなく、メソッドを呼び出した結果、変更された内部状態をテストするようにしてはいかがでしょうか。
これであれば、メソッドの呼び出し順序を気にする必要がなくなります。

コード:
public void test() {
    ....

    method_A();
    assertEquals(....);
    assertEquals(....);

    ....
}


YOU@IT
ぬし
会議室デビュー日: 2002/03/29
投稿数: 284
お住まい・勤務地: 大阪
投稿日時: 2004-03-17 15:25
よくやるのは、メソッドBをprotectedにして、テストケース内で
スタブコードでオーバーライドします。

例えば、こんな感じ...
コード:

public class Hoge {

public String getReversedValue() {
return new StringBuffer(getValue()).reverse().toString();
}

private String getValue() {
return 何か処理して文字列を返す;
}
}


で、Hoge#getReversedValue()がHoge#getValue()の結果を反転させることをテストしたい場合は、

まず、Hoge#getValue()をオーバーライド可能なようにprotectedにしてから...
コード:

public class HogeTest extends TestCase {

public void testGetReversedValue() {
Hoge hoge = new Hoge() {
/* オーバーライド */
public String getValue() {
return "hoge";
}
};

assertEquals("egoh", hoge.getReversedValue());
}
}


のようにします。

ただし、テストしたいがためにprivateなメンバをprotectedにしないと
いけない点がどうかと言う気もします。
とにかくカプセル化は壊したくない、という場合には使えないかもしれません。
# 私の場合は、protectedならどうせ見えても同一パッケージ内だけだという事で割り切ってます。

http://www-6.ibm.com/jp/developerworks/java/030207/j_j-mocktest.html
が参考になるかと思います。

# サンプルコードに誤りがあったので直しました(^^;

[ メッセージ編集済み 編集者: YOU@IT 編集日時 2004-03-17 15:27 ]
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2004-03-18 07:16
単体テストはそこまでスタブにこだわらなくても問題ないです。
実コードにバグが少なければそれを利用してテストするのが一般的な手法です。
実際単体テストなどに避ける工数は高々知れているので、なるべく効率的にやりましょう。
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2004-03-18 10:27
こんにちは、Wataです。

私としては、単体テストは積み上げていくものだと思っています。なので、別のテストメソッドで、メソッドBの正当性が保証されていれば、メソッドAがテストがメソッドBに依存しても構わないと思います。

同様に、クラス2のメソッドCに関しても、クラス2のインスタンス化やメソッドCの呼び出しがハードコーディングされているならば、無理してスタブを用意する必要はないと思います。後に、リファクタリングされ、クラス2がインターフェースを介して使用されるようになったら、スタブを使うようにテストを変更するかもしれません。
ナスティキャット
常連さん
会議室デビュー日: 2004/03/03
投稿数: 24
投稿日時: 2004-03-18 12:54
皆さん返信ありがとうございます。

大変参考になりました。
おかげで今後のテストケースを何処まで細かくするかが決まりました。

[ メッセージ編集済み 編集者: Rhyme 編集日時 2004-03-18 12:57 ]
1

スキルアップ/キャリアアップ(JOB@IT)