1

これは私が言っているよりも曖昧に聞こえますが、クラスでメソッドをテストする場合、正しいプロセスは何ですか。

たとえば、顧客クラスは、実際のパスワードではなく、設定されたパスワードの md5 ハッシュをデータベースに保存します。顧客クラスのプライベート メソッドは、保存用の md5 ハッシュを計算します。

public class Customer() {

public void setPassword(String password){
  this.password = hashPassword(password);
}

private String hashPassword(String password){
  ..do stuff..
}

.. other methods ..

}

これは単なる例です。md5 ハッシュなどの計算方法については知りたくありません。それはテストに関するものです。これが私が考えることができる私のオプションです:

  • hashPassword と同じことを行うテスト クラスにメソッドを作成し、結果を比較します。
  • 特定のパスワード (myPassword) の結果がどうなるかを手動で計算し、定数として保存します。テストでパスワードを myPassword に設定した後、定数と結果を比較します。
4

7 に答える 7

4

2 番目のオプションを使用する必要があります。つまり、値または値のシーケンスを事前に計算し、それらでテストします。同じメソッドのコピーを使用してメソッドをテストしても、コードの重複が増えるだけです。

于 2012-11-25T13:25:44.293 に答える
1

これを行う

特定のパスワード (myPassword) の結果がどうなるかを手動で計算し、定数として保存します。テストでパスワードを myPassword に設定した後、定数と結果を比較します。

まったく同じ実装の結果と比較して実装をテストしても意味がありません。

于 2012-11-25T13:26:22.453 に答える
1

2 つの実装で同じバグを実装する可能性があるため、同じアルゴリズムは使用しません。この手動計算は間違っている可能性があるため、手動で計算しません。代わりに、いくつかの参照入力を使用して、アルゴリズムの出力が参照出力と同じであることを確認します。次のページを参照してください。

MD5 test suite:
MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") =
d174ab98d277d9f5a5611c2c9f419d9f
MD5 ("123456789012345678901234567890123456789012345678901234567890123456
78901234567890") = 57edf4a22be3c955ac49da2e2107b67a

ここで、MD5 の実装を信頼し、ダイジェスターが呼び出されることを確認したいだけの場合は、モック MD5 ダイジェスターを挿入し、パスワードを設定したときにモック ダイジェスターが呼び出されることを確認できます。

于 2012-11-25T13:30:23.973 に答える
1

私は間違いなく2番目のアプローチを取ります。あなたが望む最後のことは、テストコードが「テスト中のユニット」で機能を複製することです。

  1. 既知のプレーン テキストとハッシュされた結果のリストを保存します。
  2. setPasswordプレーンテキストで呼び出すテストを追加します
  3. ハッシュ値を「チェック」するメソッドを追加します。テスト用に追加する場合は、この 1 つのパッケージを表示します。

ここでのボーナスは、メソッドをテストしていないhashPasswordことです。パスワードが正しくハッシュされていることを確認しています。テスト コードは、プライベート メソッドがそこにあることを認識したり気にしたりしてはなりません。実際にはクラスの実装の秘密であるため、パスワードがハッシュされていることをテストする必要があるかどうか疑問に思いますがCustomer、テストする正当な理由があるかもしれません。

于 2012-11-25T13:32:48.300 に答える
0

3番目のオプションもあります。

JunitAddonsライブラリを使用すると、リフレクションを使用してプライベート メソッドをテストできますが、リフレクションの複雑さが隠されます。

例: メソッド setValue() を使用してオブジェクト obj の値を 100 に設定するには:

PrivateAccessor.invoke( obj, "setValue", new Class[]{int.class}, new Object[]{
    new Integer( 100 )} );

プリミティブ型の場合、メソッドによって返される値は自動的にオブジェクトにラップされます。

于 2012-11-25T13:24:24.367 に答える
0

オプション番号2から、opensslを使用して計算し、後で比較するために保存します:)

于 2012-11-25T13:25:59.463 に答える
0

いくつかの重要なロジックが含まれているため、プライベート メソッドをテストしたいと思います。おそらく最善のアプローチは、そのメソッドの本体を外部クラスに移動することでしょうか?

あなたのコード スニペットは良い例です - MD5 のカウントは Customer クラスの外で行う必要があります - これは Customer と呼ばれるものの責任ではありません。

private String hashPassword(String password) {
    this.hash = PasswordHasher.hash(password)
}

そして後でpublic(or default/protected) String PasswordHasher#hash(String)テストされやすい

于 2012-11-25T13:33:03.230 に答える