【发布时间】:2013-10-02 20:58:23
【问题描述】:
我在一个包含许多嵌入 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 { 公共无效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);
}
你觉得它“干净”吗?你觉得可以改善吗?你认为它太重和/或无用吗? 我的主要目标是在我们的开发团队中统一测试异常。 (当然还有分解代码)
感谢阅读!
【问题讨论】:
标签: java unit-testing design-patterns exception-handling junit