Junit4: 非掚奚のExpectedExceptionルヌル

䜜成日 2019幎05月05日  Â·  22コメント  Â·  ゜ヌス: junit-team/junit4

SpringFrameworkをJUnit4.13ベヌタ3にアップグレヌドした埌、 org.junit.rules.ExpectedExceptionが@Deprecatedになっおいるこずに気付きたした。この倉曎により、そのような倧芏暡なコヌドベヌスで倚くの譊告が生成されたす。

4.13は4.xラむンの最埌のリリヌス予定であるため、このような䞀般的に䜿甚されサポヌトされおいる機胜を非掚奚にするこずは意味がないず思いたす。

非掚奚をそのたたにしおおくず、正圓な理由もなく、数千数癟䞇の開発者を悩たせるだけになるのではないかず心配しおいたす。

最も参考になるコメント

@daicoden

assertThrowsがスロヌ可胜オブゞェクトを返すず確信しおいるので、他のオブゞェクトの堎合ず同じように、それをキャプチャしおアサヌションを䜜成できたす。

StatusRuntimeException thrown = assertThrows(StatusRuntimeException.class, () -> {
   GrpcDispatch.makeRequest(service::enableJob, JobReference.newBuilder().setName(UNKNOWN_JOB).build());
});

assertEquals(Status.INVALID_ARGUMENT, thrown.getStatus());

党おのコメント22件

非掚奚の譊告は、より良いものが利甚可胜であるこずを瀺す良い方法だず思いたす。そのため、正圓な理由もなく譊告は衚瀺されたせん。 ExpectedExceptionは簡単に誀甚される可胜性がありたすが、それでも倚くの堎所で掚奚されおいたす。

問題は、ナヌザヌがこれらの非掚奚の譊告を受け取るこずがどれほど問題があるかずいうこずです。 私の䌚瀟では、非掚奚の譊告はビルド時に衚瀺されたせんコヌドを衚瀺しおいる堎合のみ。

サムはここにポむントがあるず思いたす。 私はすべおの新しいコンパむラ譊告を犁止する倚くのビルドを芋おきたした。 このようなプロゞェクトでは、 ExpectedExceptionを䜿甚するすべおのテストクラスを実行し、 SuppressWarningsアノテヌションを远加する必芁がありたす。

@stefanbirkner WDYT

クラむアントに譊告を抑制させるのは合理的なようです。 たた、すべおの非掚奚譊告を抑制するこずもできたす。 非掚奚の譊告を゚ラヌずしお扱うず、䜕も非掚奚にするこずができなくなりたす。

非掚奚は、叀いAPIに問題があり、はるかに優れたAPIが利甚可胜であるこずを人々に瀺すための最善の方法です。

開発者がIDE内でロヌカルに譊告を抑制できるこずを理解しおいたす。 ただし、JUnit 4.xの予定されおいる最終リリヌスでコア機胜を廃止するこずは良い考えであるこずに同意したせん。

私芋ですが、フレヌムワヌクの最終リリヌス、特にJUnit 4のように広く䜿甚されおいるフレヌムワヌクのコア機胜を廃止するこずは、お勧めできたせん。

具䜓的な䟋ずしお、コアSpring Frameworkテストスむヌトでは、 ExpectedExceptionルヌルの䜿甚に関する数千の非掚奚譊告がありたす。

私たちが持っおいる唯䞀のオプションは次のずおりです。

  1. ExpectedExceptionを䜿甚するすべおのテストクラスで非掚奚の譊告を抑制したす。
  2. ExpectedExceptionを䜿甚するすべおのテストクラスでの䜿甚から移行したす。
  3. 䜕もしない。

1を䜿甚するず、クラスレベルで譊告を抑制するスクリプトを䜿甚しおそれを実珟できる可胜性がありたすが、それにより、知っおおく必芁があり、無芖しない可胜性のある他のAPIの非掚奚譊告が抑制されたす。 それ以倖の堎合は、各テストクラスを手動で実行し、 ExpectedException APIの䜿甚を非掚奚にする必芁がありたす。これには、圱響を受けるすべおのテストメ゜ッドでのルヌルむンスタンスずのすべおの単䞀の盞互䜜甚が含たれたす。

2を䜿甚する堎合、これは手動で実行するのに数日かかる可胜性のある䞻芁な䜜業です。 郚分的な自動化は可胜かもしれたせんが、自動化スクリプトなどぞの投資はそれ自䜓でかなり広範囲に及ぶ可胜性がありたす。

3を䜿甚するず、私たちの芳点から䞍芁な非掚奚譊告が発生し、実際に気になる非掚奚譊告のビュヌが曇っおしたい、りィンドりが

2を実行するず、JUnit5ぞの将来の移行が簡玠化されたす。

2を実行するず、JUnit5ぞの将来の移行が簡玠化されたす。

もちろん。 これにより、JUnitJupiterたたはAssertJぞの移行が簡単になる可胜性がありたす。 ただし、すべおの人が既存のテストスむヌトを移行したい、たたは移行する必芁があるわけではありたせん。

したがっお、私はそれを有効な議論ずは芋なしたせん。

これが最埌のJUnit4.xリリヌスである可胜性が高いのは、私たちが物事を非掚奚にするかどうかに関係しおいる理由がわかりたせん。 JUnitが_any_APIを削陀するこずはめったにないため、非掚奚はAPIがなくなるこずを瀺すものではありたせん。 これは、APIがサポヌトされおいないか、より優れたAPIが存圚する可胜性があるこずを瀺しおいたす。 この堎合、䞡方ずも圓おはたりたす assertThrows()䜿甚する方がよいず考えたため、このルヌルに察する提案された倉曎を拒吊したした

SpringはExpectedExceptionからゆっくりず移行するこずをお勧めしたす。 より安党で理解しやすいテストに到達するために、数日間の䜜業が数か月に枡っお行われたこずは、勝利のように思えたす。 利点は、JUnitの最近の倉曎にあたり詳しくない他の人が、 ExpectedExceptionを回避するこずを知っおいるこずです。

ErrorProneには、掚奚される修正を提䟛するありたす。したがっお、この問題を解決するのに数日かかるずは思いたせん。

TL; DRExpectedExceptionの非掚奚に賛成です。

@kcooneyは、JUnit 4の蚭蚈䞊の決定は倉曎の

䟋倖をチェックするより良い方法があるこずを人々に䌝えるので、非掚奚にするこずは有益だず思いたす。 私は過去10幎間、いく぀かの䌚瀟で働いおいたしたが、 @Test(expected=ABeautifulException.classよりも優れたものがあるこずに驚いおいる人が垞にいたす。 非掚奚は、IDEでストラむキされたコヌドを芋るず通垞芋られるため、圌らにずっお䟡倀がありたす。

これらの譊告を修正する必芁がないため、非掚奚の譊告は煩わしい堎合がありたす。 これの起源は、JUnit4が非掚奚を䜿甚する方法です。 したがっお、ExpectedExceptionを非掚奚にしないそしお最終的には非掚奚をたったく䜿甚しないこずを陀けば、これに察する修正はないず思いたす。

最埌になりたしたが、非掚奚の譊告が発生した堎合にビルドが壊れお、JUnit4.13に簡単にアップグレヌドできない䌁業がありたす。 これらの䌁業がどれだけ存圚するかはわかりたせん。これらの䌁業は、aこのビルドポリシヌを持っおおり、bJUnit4.13にアップグレヌドしたいず考えおいたす。

@sdeleuze、@ mp911deずあなたが廃止を元に戻すに投祚@rweisleder。 非掚奚にしない理由を教えおいただければ助かりたす。

もう少し詳しく説明するず、Spring FrameworkのコヌドベヌスをJUnitのExpectedExceptionからAssertJのassertThatExceptionOfTypeに移行するのに玄1。5日かかりたした。

圹立぀かもしれない小さな提案の1぀は、クラス党䜓ではなく、 ExpectedException.none()メ゜ッドのみを非掚奚にするこずを怜蚎するこずです。 これは䟝然ずしお人々に譊告を䞎えたすが、それは単独で抑制するこずをはるかに容易にしたす。

JUnitのExpectedExceptionは、 @Test(expected = 
)だけでなく、より広範な䟋倖アサヌションを実行するテストのプリミティブ型ずしお䜿甚されたす。 これらは通垞、Hamcrestたたは組み蟌みのアサヌションに䟝存するテストであり、AssertJなどにはあたり䟝存したせん。

JUnit 4.13を䜿甚しおいるこずは、アクティブなメンテナンスが行われおいるこずを瀺しおいたす。 JUnit 4.x APIに残っおいるコヌドベヌスは、すぐにJUnit 5 APIに移行されない可胜性がありたすが、ノィンテヌゞ゚ンゞンに移行する可胜性のあるAPIを維持したす。 突然非掚奚になったクラスがあるず、新しい譊告が生成され、コヌドはただ機胜しおいる可胜性がありたすが、別のアサヌションナヌティリティに移行するための远加の䜜業が発生したした。

非掚奚ず改善されたAPIの導入を数回芳察したした。 ほずんどの堎合、非掚奚は実際のナヌザヌではなくメンテナに圹立ちたした。 ナヌザヌ偎では、これはほずんどの努力を生み出したしたが、利益はありたせんでした。

圹立぀かもしれない小さな提案の1぀は、クラス党䜓ではなく、 ExpectedException.none()メ゜ッドのみを非掚奚にするこずを怜蚎するこずです。 これは䟝然ずしお人々に譊告を䞎えたすが、それは単独で抑制するこずをはるかに容易にしたす。

JUnit 4チヌムがExpectedExceptionルヌルの廃止を取り消さないこずを決定した堎合、これは適切な劥協案になるず思いたす。

私はかしら@Test(expected = ...)我々は持っおいるので、たた、廃止されるべきでassertThrows今すぐ。 たたは、少なくずもExpectedExceptionぞの参照を属性のJavadocから削陀する必芁がありたす。

私はかしら@Test(expected = ...)我々は持っおいるので、たた、廃止されるべきでassertThrows今すぐ。 たたは、少なくずもExpectedExceptionぞの参照を属性のJavadocから削陀する必芁がありたす。

はい、 expectedで属性org.junit.Testおそらく廃止されるべきです。 いずれの堎合も、 org.junit.Testおよびexpected属性のクラスレベルのJavadocを曎新しお、 assertThrows䜿甚を掚奚する必芁がありたす。

ExpectedException.none()だけを非掚奚にするこずに賛成です。

非掚奚を䜿甚しお新機胜をアドバタむズするこずは、JUnit開発プロセスぞの信頌を損ない、バヌゞョン4.13の採甚を劚げるような手間のかかるアプロヌチだず思いたす。

叀い機胜ず新しい機胜が非掚奚になるこずなく共存する堎合は、バヌゞョンが重耇するはずです。 他の人が指摘しおいるように、非掚奚のメ゜ッドに䟝存するこずは、コヌドの品質を高く保぀倚くのプロゞェクトにずっおは無駄です。 ぀たり、JUnitのアップグレヌドは、コヌドベヌス党䜓を移行するための倉曎ず同じコミットで行う必芁がありたす。

機胜が非掚奚になり、同じリリヌスで眮換が远加される唯䞀の状況は、機胜が根本的に壊れおおり、すぐに移行する必芁がある堎合だず思いたす。 ExpectedExceptionが根本的に壊れおいるずは思いたせん。

新しい䟝存関係をチェックしお、どのような倉曎が行われるのか、コヌドをどのように準備できるのかを確認するこずがよくありたした。 では、JUnit 4.13の移行に向けおコヌドを準備するにはどうすればよいですか ExpectedExceptionが非掚奚になるこずは知っおいたすが、ただ適切な代替品がありたせん。 その混乱を完党に回避するために、䟋倖をキャッチしおチェックするために独自のコヌドを実装する必芁がありたす。

4.13が最終的な4.xリリヌスになる予定であるずいう理由だけで、たずもな゜フトりェア開発慣行を攟棄するのは良い理由ではありたせん。 実際、4.13はExpectedException非掚奚なしでリリヌスでき、4.14は非掚奚の翌日リリヌスできたす。 それは、開発者に過床のプレッシャヌなしに移行を行うための少しの息抜きを䞎えながら、メッセヌゞを䌝えるでしょう。

叀い機胜ず新しい機胜が非掚奚になるこずなく共存する堎合は、バヌゞョンが重耇するはずです。

どうしお 非掚奚の目的は、私たちの意芋では、より良いAPIである新しいこずを人々に認識させるこずです。

たた、䟵襲性を䜎くするためにExpectedException.none()のみを非掚奚にする必芁があるこずにも同意したす。

@stefanbirknerよろしいですか

@marcphilippコヌドを曎新するずき、䜕か間違ったこずをしおいない限り、非掚奚になるこずなく動䜜させたいず思っおいたす。 機胜を廃止するず同時に代替品を提䟛するには、煩わしすぎたす。 代わりに、4.13リリヌスノヌトには、 ExpectedExceptionが次のバヌゞョンで非掚奚になるず蚘茉されおおり、眮き換えを提案する必芁がありたす。 そうすれば、その間に非掚奚を蚱可するこずなく、コヌドを段階的に移行する方法がありたす。 これは、JUnit 4.12を䜕幎も䜿甚しおいお、倧きな倉曎を望たないナヌザヌぞの基本的な瀌儀です。

非掚奚の譊告のポむントは、コヌドを眮換に向けお移行する時間を䞎えるためのものです。 非掚奚の譊告を回避する必芁がある堎合は、 ExpectedException.none()委任する独自の䞀時ファクトリメ゜ッドを䜜成できたす。

OK、PRは問題をある皋床軜枛したす、それは間違いなく正しい方向ぞの䞀歩です。 それをしおくれおありがずう

ナヌザヌがファクトリメ゜ッドを実装するこずを提案するのではなく、コヌドは独自の非掚奚でないメ゜ッドを提䟛するこずができたすおそらくnoneに远加の匕数がありたす。

ナヌザヌに移行バヌゞョンを提䟛するこずに察する抵抗をただ理解しおいたせん。 互換性のない倉曎を実装する堎合、匷制せずに移行できるバヌゞョンを䜜成するこずは非垞に䞀般的です。

移行バヌゞョンがない堎合、ナヌザヌは4.13を詊し、倧量の譊告を確認しお、4.12に戻りたす。

移行バヌゞョンでは、ナヌザヌは4.14を詊し、倧量の譊告を衚瀺し、4.13を詊し、譊告を衚瀺せず、それを䜿甚したす。 すぐに4.14に曎新するものもあれば、曎新する正圓な理由がない限り、4.13をそのたた䜿甚するものもありたす。 どちらにしおも問題ないはずです。

たた、この非掚奚がJUnit 4で発生した理由もわかりたせん。䞡方のバヌゞョンを䞀時的にサポヌトするために、 junit-vintage-engineを䜿甚しおJUnit5に移行しおいたす。 しかし、これはJUnit 4.13を匕き蟌みたす。これは、䜕らかの理由で、最埌のリリヌスの1぀である可胜性が高いもの長幎サポヌトされおきたものを非掚奚にするこずをお勧めしたす。

たた、代替案を指摘する以倖に非掚奚の理由はないようです。これは、少なくずも代替案を提䟛するこずで達成できた可胜性がありたすコンストラクタヌを公開するか、別の静的メ゜ッドを提䟛したす-メッセヌゞ通信。

ExpectedExceptionコヌドは、圓時䟿利な方法で提䟛されたJUnitの基本機胜を䜿甚するだけなので、珟圚も機胜し続けたすそしお、今埌のリリヌスでも機胜し続けたす。

䟋倖に関するプロパティをアサヌトするための代替手段は䜕ですか...

叀いコヌド

thrown.expect(StatusRuntimeException.class);
thrown.expect(its(StatusRuntimeException::getStatus, toBe(Status.INVALID_ARGUMENT)));
GrpcDispatch.makeRequest(service::enableJob, JobReference.newBuilder().setName(UNKNOWN_JOB).build());

assertThrowsには、予期された䟋倖を完党に非掚奚にするためのマッチャヌバヌゞョンがないようです。手遅れだずわかっおいたすが、他の誰もこの問題を抱えおいたせんか

@daicoden

assertThrowsがスロヌ可胜オブゞェクトを返すず確信しおいるので、他のオブゞェクトの堎合ず同じように、それをキャプチャしおアサヌションを䜜成できたす。

StatusRuntimeException thrown = assertThrows(StatusRuntimeException.class, () -> {
   GrpcDispatch.makeRequest(service::enableJob, JobReference.newBuilder().setName(UNKNOWN_JOB).build());
});

assertEquals(Status.INVALID_ARGUMENT, thrown.getStatus());
このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡