我在一个包含许多嵌入错误代码的“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 { 公共无效runAndExpectException(类expectedException,字符串expectedErrorCode){ String failUnexpectedExceptionMessage = "意外异常。预期为:'%s',但得到:'%s'"; 尝试 { 代码执行(); fail("'" + expectedException.getName() + "' 没有抛出"); } 捕捉(业务异常 e){ if (e.getClass().equals(expectedException)) { assertThat("不应出现异常错误代码", e.getErrorCode(), is(expectedErrorCode)); } 别的 { 失败(String.format(failUnexpectedExceptionMessage,expectedException.getName(),e)); } } 捕捉(异常 e){ 失败(String.format(failUnexpectedExceptionMessage,expectedException.getName(),e)); } } 抽象公共无效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);
}
你觉得它“干净”吗?你觉得可以改善吗?你认为它太重和/或无用吗?我的主要目标是在我们的开发团队中统一测试异常。(当然还有分解代码)
谢谢阅读!