JUnit4のassertThat()って便利なの?

JUnit4ではhamcrestライブラリーが統合されており、伝統的なassertEquals()を使った比較以外に汎用的なassertThat()が使えます。これを使うとより英語的に自然に読めるアサーションを記述できるとされています。しかし、Classクラス同士の比較ができないといった問題もありますし、そもそも日本人にとって便利なのかという疑問もわきます。
10
Ryo Asai @ryoasai74

@tadayosi assertThatがいまいち好きになれないのは、括弧の多さと半端な型チェックですかね。あと、プログラマーが英語脳である前提。このあたり#Groovy と組み合わせると結構いい感じに書けそうな気がします。実際、GroovyはさまざまなテストFWと連携できます。

2011-04-29 22:08:04
Ryo Asai @ryoasai74

@tadayosi Javaだと型推論が弱いし、記述はかなり面倒な気がするのですよ。その点、まだしも伝統的なassertEquals()の方が、日本人の平均的なプログラマーにとっては、単純で理解しやすいのではないかと思えてしまうのです。

2011-04-29 22:12:43
Ryo Asai @ryoasai74

@tadayosi 四則演算でCOBOLの英文のような表記が必ずしも可読性が高くないのと同様に、greaterThanなどは式で表現した方が日本人にとってはわかりやすいのではないかなと。#Groovy だとassert文自体が強力なので、これと式の組み合わせでテストを書けますね。

2011-04-29 22:16:04
SHUJI🐊 @shuji_w6e

@ryoasai74 個人的にはMatcherを作れる辺りはassertThatの利点かなーとは思います

2011-05-02 21:37:33
koichik @koichik

@ryoasai74 なんだかなぁ.JUnit3 だって標準のままだと配列の検証とかしっくりこないのでは? JUnit4 だって足りないところは補えばいいだけhttp://ow.ly/4L4HY JUnit3 だってそうしてきたのでは?

2011-05-02 21:42:38
Ryo Asai @ryoasai74

@shuji_w6e なるほど。確かに、ドメインのオブジェクトなどに対して、独自の条件でMatcherを作成することで、独自言語を拡張できそうです。

2011-05-02 21:43:22
Ryo Asai @ryoasai74

@koichik assertEqualsの方は実質的に@Deprecatedと思った方がよいのでしょうかね。お互いにうまく混じり合わない気がするのですよね。

2011-05-02 21:53:02
koichik @koichik

@ryoasai74 JUnit4 には互換性のために JUnit3 が丸ごと含まれていて,assertEquals (Assert クラス) もその一部というだけでしょう.EJB3 の中の EJB2.1 のようなもの.

2011-05-02 22:02:48
Junichi Ito (伊藤淳一) @jnchito

@ryoasai74 うわ、「しっくりこないんです!」で来た〜!!ww

2011-05-02 22:04:13
Ryo Asai @ryoasai74

実質レガシーということですね。RT @koichik: @ryoasai74 JUnit4 には互換性のために JUnit3 が丸ごと含まれていて,assertEquals (Assert クラス) もその一部というだけでしょう.EJB3 の中の EJB2.1 のようなもの.

2011-05-02 22:06:46
koichik @koichik

しまった,JUnit3 の Assert と,JUnit4 の Assert は別物だった.JUnit4 初期が記憶から消えてる.っていうか,後期もというか Java が記憶から消えかけてるw

2011-05-02 22:14:07
Shingo Omura ⎈ @everpeace

@ryoasai74 @shuji_w6e それspecification patternに似てるんですかね。Matcherは宣言的な条件(仕様)記述ができるので親和性が高そうです。

2011-05-02 23:05:55
🍻 @kompiro

assertThat()ってメソッド名が宣言的なんだろか。

2011-05-02 23:08:14
Shingo Omura ⎈ @everpeace

@ryoasai74 で僕はあるビーンが満たす条件を宣言的に書きたいなぁと思ってMatcherと格闘してました。でも宣言的に書こうとして突き詰めていくとラムダが欲しくなったのでそこで行き詰まってそのままです><

2011-05-02 23:10:14
wyukawa @wyukawa

イマドキだからという理由だけで使ってたりしますw>実はJUnit4のassertThat()ってしっくりこないんです!(特に、メタプログラミングするレイヤでは) - 達人プログラマーを目指して http://bit.ly/jNebJD

2011-05-02 23:19:07
Ryo Asai @ryoasai74

@everpeace コメントありがとうございます。コメント追記しました。もともとのassertEqualsはある意味ダックタイプな感じのところがあったのですが、assertThatは比較対象が同じ型を持つ必要があるというところがもっとも思想が違うところかなと思います。

2011-05-02 23:28:17
Ryo Asai @ryoasai74

@everpeace まあ、assertEquals()はequals()判定に頼っていて、独自のマッチングがしたい場合独自のassertメソッドを書くということで拡張していたわけですが。

2011-05-02 23:30:47
Ryo Asai @ryoasai74

MatcherのパラメーターTについては今でも議論があるいみたいですね。 / Issue 83 - hamcrest - is(Class) and is(Object) both are Matcher<Object>, w… http://htn.to/KkyZih

2011-05-02 23:36:29
Shingo Omura ⎈ @everpeace

@ryoasai74 とんちんかんなコメントばかり失礼しました。

2011-05-02 23:37:57
Ryo Asai @ryoasai74

@everpeace いいえ。ところで、僕の場合新しいライブラリを試す場合にはどうしても懐疑的になる傾向がありますね。コードを書いて本当に有用かどうか試してみるところから入るので、利便性が明確でないとなかなか受け入れられない保守的なところもあるかもしれません。

2011-05-02 23:42:57
Shingo Omura ⎈ @everpeace

@ryoasai74 僕正反対ですねw 結構新しいもの好きなので、飛びついちゃいますね。でだめだったらすぐやめるw 良さがわかってきたら使い続ける感じです。

2011-05-02 23:44:13
Ryo Asai @ryoasai74

@everpeace EJBに対する疑問からSpringが生まれたように、必ずしも有名なライブラリーや標準であっても、利便性を疑ってみるというのは大切なのではないかと思うのですよね。食わず嫌いはいけないので、積極的に新しいものを試す姿勢も大切ですが、権威に従う必要はないのかと。

2011-05-02 23:46:26
Shingo Omura ⎈ @everpeace

@ryoasai74 そうですね。「懐疑」は重要だと思います。フランシス・ベーコンもそういってます。疑惑を持って始まれば確信に終わる。確信を持って始めれば疑惑に終わる。

2011-05-02 23:48:23
Sotaro Kimura @kimutansk

型比較は躊躇い無くassertEqualsを継続使用していたなぁ。やはり出来る人は拘るんだろうか。。。>JUnit4のassertThat()ってしっくり~- 達人プログラマーを目指して (id:ryoasai / @ryoasai74) http://t.co/vcR15VT

2011-05-03 00:04:50
うらがみ⛄ @backpaper0

JUnit4は俺俺MatcherとMethodRuleが楽しいれす

2011-05-03 01:15:29