#navi_header|技術| * TestNGのデフォルトのAssertion TestNGのデフォルトのAssertionは、 org.testng.Assert クラスにstaticメソッドとして用意されてます。 import staticして使う形になると思います。 - http://testng.org/javadocs/org/testng/Assert.html primitive型, Object, byte[], Object[], Collection, Set, Map などひと通り揃っています。 デフォルトのCollectionのassertは順番に依存します。順番がどうなるか分からないけど、要素だけ一致しているか確認したい場合は、一度Object[]に直した上でassertEqualsNoOrder()を使えば良いと思います。 自前のクラスのインスタンスを使ってる場合も、ちゃんとhashCode()やequals()を実装しておけば一致チェックしてくれる筈です・・・多分・・・。hashCode(), equals(), toString()はEclipseの自動生成を使うと楽ちんです。 というわけで、ざっくりとassertionを色々と呼び出してみたサンプルが以下になります: - https://github.com/msakamoto-sf/javasnack/blob/master/src/test/java/javasnack/testng1/TestAssertionSamples.java -- ( https://github.com/msakamoto-sf/javasnack/commit/dfc75a0f6fd3f44e7f1c82f0da711a161dabae4b ) * カスタムAssertionの作成 上記の"TestAssertionSamples.java"に含めていますが、基本的にはお好みの一致チェックメソッドを作成して、一致に失敗したら org.testng.Assertのfaile()メソッドを呼び出します。 (原理的には java.lang.AssertionError をthrowしても同等に思えるのですが、試してみたらEclipse上のTestNGプラグインやコンソールのスタックトレースが一個前のassertEquals()になってしまいうまく動かなかったため、fail()の方を使ってます。github上のTestNGのソースを読めば、fail()も最終的にはAssertionErrorをthrowしてます) #code|java|> void assertCalendarYearIs(Calendar actualCalendar, int expectedYear) throws AssertionError { int actualYear = actualCalendar.get(Calendar.YEAR); if (actualYear != expectedYear) { fail(String.format("expected [%d] but found [%d] in [%s]", expectedYear, actualYear, actualCalendar.toString())); } } @Test public void assertCalenderAndCustomAssertion() { Calendar ac = Calendar.getInstance(); ac.set(2000, 1, 2, 3, 4, 5); Calendar ec = Calendar.getInstance(); ec.set(2000, 1, 2, 3, 4, 5); assertEquals(ac, ec); assertCalendarYearIs(ac, 2000); } ||< Compositeデザパタを適用したりした、複雑なオブジェクトの場合は、上記のような技法で専用のassertionを用意する必要があるかもしれません。 あるいは、単に一致しているかどうかだけでなく、値が範囲内に収まっているかとか、Collectionに値が含まれているかなどドメインに特化したタイプのassertionの作成にも使えそうです。 assertionのカスタマイズとなりますと、JUnitの文化圏ではhamcrestとの組み合わせがメジャーな状況(2013/06現在)ですが、TestNGでは地雷を踏まない形でのhamcrestとのintegrationの例やドキュメントがなかなか見当たりません。決して「英語のようにスラスラ読める」訳ではありませんし、どちらかと言うと泥臭い技法になりますが、上記のようなカスタムassertionの作成は選択肢の一つに入れておいて損はないと思います。 #navi_footer|技術|