2016-08-05 3 views
4

私はJUnit 4.12を使用しています。 assertメソッドは本質的に汎用的ではありません。たとえば、assertEqualsメソッドは次のようになります。JUnitのアサートメソッドがJavaで一般的でないのはなぜですか?

static public void assertEquals(Object expected, Object actual) {..} 

なぜそうではないのですか?

コンパイル時間のチェックとIDE自動補完のために、一般的なメソッド宣言が必要だと感じました。

+0

ダウンリストの理由をご記入ください。 –

+0

ジェネリック薬はあなたに何を与えるのですか? [なぜこの質問への私の答え](http://stackoverflow.com/a/38475261/3788176)を参照してください。 –

+0

@AndyTurner私は誤って2つの異なるタイプのオブジェクトを比較しないようにしていますが、これはとにかく無効です。 IDEはスコープ内のすべての既存オブジェクトのリストを表示するのではなく、そのメソッドで渡すことができる引数についてより良い提案をします。 –

答えて

5

持ってこのような一般的な方法:TObject、その上限に退化するので、あなたがこの方法には何もして渡すことができます:

<T> void assertEquals(T expected, T actual) { /* ... */ } 

はあなたのタイプとは異なり、比較回避するために、何の型の安全性を付与するものではありません

assertEquals("string", 0); // Compiles fine, even though they can't be equal. 

Ideone demo

とNORあなたがexpected上の任意のメソッドを使用することができますし、 actualObjectに見つかりません。したがって、Tは基本的にはちょうどObjectです。

このように、ジェネリックスを追加すると実装が複雑になります。


さて、あなたはこのようなクラス定義することができます。

class GenericAssert<T> { 
    void assertEquals(T expected, T actual) { /* ... */ } 
} 

を、あなたはこのように使用できます。

new GenericAssert<String>().assertEquals("string", 0); // Compiler error. 

あなたが今により厳しい上限を配置したので、クラスレベルでassertEqualsの許容可能なパラメータ。

しかし、ちょっと気分が悪いです。

+0

ありがとうございます。私はそれを実装し、あなたが言っていることが正しいことを私は見ています。ジェネリック医薬品をよりよく理解する必要があります。 –

+0

GenericAssertは私の目的を解決することができます。しかし、JUnitで宣言されているようなきれいな静的メソッドを使用するのとは違って、異なるタイプのオブジェクトに対して異なるGenericAssetオブジェクトが必要になるため、テストケースが厄介になることがわかります。御時間ありがとうございます! –

+0

また、 'checkedAssertEquals(Object、Object)'メソッドを書いて、引数が互換性があり、 'Assert.assertEquals'が呼び出されたことを確認することもできます。コンパイル時に失敗することはありませんが、テストが実行されると失敗しますが、これはそれほど悪くありません。 –

2

assertThatとHamcrestマッチャーを見たいと思っています。 assertThatは実際にジェネリックで動作するよう:だから

assertThat(String reason, T actual, Matcher<? super T> matcher) 

assertEquals("abc", 123); 

はコンパイルしますが、失敗しました。一方

assertThat(123, is("abc")); 

もコンパイルされません。

私はその言葉についても言及していません。彼らが失敗したときにはるかに良い情報を提供します。地図、セットなどを比較するためにそれらを使用することもできます。

誰かが必要とするものが1つだけです。assertThatです!

+0

ありがとうございます。私はこれを使ってみましたが、エラーなしでコンパイルしました! –

+0

さて、私のコンパイラは私に次のように教えてくれます: 'assertThat(T、Matcher )はAssert型では引数には当てはまりません(String、Matcher )' ...そこに誤りがある。 – GhostCat

+0

まあ、org.junit.Assert.assertThatとorg.hamcrest.CoreMatchers.isを使用しましたが、コンパイル時にエラーが発生しません。 –

関連する問題