我在一个包含许多嵌入错误代码的“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);
}
你觉得它“干净”吗?你觉得可以改善吗?你认为它太重和/或无用吗?我的主要目标是在我们的开发团队中统一测试异常。(当然还有分解代码)
谢谢阅读!