3

終了順序がかなり柔軟な場合に、生成された文字列をユニット化する方法。キーと値のペアから生成された SQL を出力するコードをテストしようとしているとしましょう。ただし、多くのフラグメントの正確な順序は重要ではありません。

例えば

SELECT
    *
FROM
    Cats
WHERE
    fur = 'fluffy'
OR
    colour = 'white'

と機能的に同一です

SELECT
    *
FROM
    Cats
WHERE
    colour = 'white'
OR
    fur = 'fluffy'

条件句が生成される順序は重要ではありませんが、where 句の後に続くことは重要です。entrySet()また、 a の をループするときのペアの順序は予測できないため、予測するのは困難HashMapです。キーを並べ替えるとこれは解決しますが、ビジネス価値がない (または負の) 場合に実行時のペナルティが発生します。

順序を過度に指定せずに、そのような文字列の生成を単体テストするにはどうすればよいですか?

正規表現の使用を考えました、次のような書き方が思いつきませんでした:

正規表現は私が考えていたものですが、「SELECT * FROM Cats WHERE」の後に {"fur = 'fluffy', color = 'white'} のいずれかが続き、その後に「OR」followed by one of one of {"fur = 'fluffy',色が続くような正規表現を考えることができます= 'white'} ... 前回使用したものではありません。

注意:私は実際に SQL でこれを行っているわけではありません。問題を組み立てる簡単な方法を作成しただけです。

4

4 に答える 4

0

まず、LinkedHashMap通常の の代わりに a を使用しHashMapます。これにより、パフォーマンスが著しく低下することはありません。ソートするのではなく、挿入順序を保持します。

次に、よく理解された方法でペアをマップに挿入します。おそらく、テーブルからデータを取得していて、順序付けインデックスを追加することは受け入れられません。しかし、おそらくデータベースは主キーなどで並べ替えることができます。

これら 2 つの変更を組み合わせると、予測可能な結果が得られるはずです。

または、文字列の等号よりもスマートなものを使用して、実際と予想を比較します。おそらく、実際の SQL クエリに挿入されたすべてのペアをかき出すための正規表現でしょうか?

于 2013-01-03T15:48:54.230 に答える
-2

私がこれまでに思いついた最善の方法は、テスト中にいくつかのライブラリを使用して (PowerMockito など)、 をHashMaplikeSortedMapに置き換えることTreeMapです。そうすれば、テストの順序が固定されます。ただし、これは、文字列を生成するコードと同じコードでマップが構築されていない場合にのみ機能します。

于 2013-01-03T15:39:30.660 に答える