私は、errorCode を埋め込んだ多くの「BusinessException」を含むプロジェクトに取り組んでいます。
例外のすべての単体テストでは、次のようなパターンを繰り返すエラー コードをテストする必要があります。
@Test
public void zipFileReaderCtorShouldThrowAnExceptionWithInexistingArchive() {
try {
zfr = new ZipFileReader("unexpected/path/to/file");
fail("'BusinessZipException' not throwed");
} catch (BusinessZipException e) {
assertThat("Unexpected error code", e.getErrorCode(), is(ErrorCode.FILE_NOT_FOUND));
} catch (Exception e) {
fail("Unexpected Exception: '" + e + "', expected: 'BusinessZipException'");
}
}
(エラーコードのテストのため、JUnit アノテーションの使用は不可能です)
特に、fail() のエラー メッセージで例外名をコピー/貼り付けする必要があったため、これを行うのは退屈でした。
そこで、Util クラスを作成しました。抽象クラスを使用して、例外アサート テストを処理します。
パブリック抽象クラス TestExceptionUtil { public void runAndExpectException(Class expectedException, String expectedErrorCode) { String failUnexpectedExceptionMessage = "予期しない例外です。予期されるのは: '%s' ですが、取得したのは: '%s'"; 試す { codeToExecute(); fail("'" + expectedException.getName() + "' スローされません"); } キャッチ (BusinessException e) { if (e.getClass().equals(expectedException)) { assertThat("例外エラー コードは予期されません", e.getErrorCode(), is(expectedErrorCode)); } そうしないと { fail(String.format(failUnexpectedExceptionMessage, expectedException.getName(), e)); } キャッチ(例外e){ fail(String.format(failUnexpectedExceptionMessage, expectedException.getName(), e)); } } abstract public void codeToExecute(); }
次に、クライアントは次のように使用します。
@Test
public void zipFileReaderCtorShouldThrowAnExceptionWithInexistingArchive() {
new TestExceptionUtil() {
@Override
public void codeToExecute() {
zfr = new ZipFileReader("unexpected/path/to/file");
}
}.runAndExpectException(BusinessTechnicalException.class, ErrorCode.FILE_NOT_FOUND);
}
「きれい」だと思いますか?改善できると思いますか?重すぎる、または役に立たないと思いますか?私の主な目的は、開発チームでテスト例外を統一することです。(そしてもちろん因数分解コード)
読んでくれてありがとう!