【发布时间】:2017-05-31 07:08:25
【问题描述】:
我有一个公共项目,其中包含一些正在另一个项目中使用的共享代码。我正在尝试将常见项目CommonException 中的异常转换/映射为一种新类型的异常,我们称之为SuperAwesomeException。
我们的目标是有一种通用的方式来处理项目中的所有自定义异常。
我尝试使用UncaughtExceptionHandler 来执行此操作。这似乎在运行项目时有效,但在 JUnit 中无效,因为这将每个测试包装在一个 try/catch 块中,如 here 所述。
public final class ExceptionHandler implements Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread thread, Throwable exception) {
if (exception instanceof CommonException) {
throw new SuperAwesomeException(exception.getMessage());
}
if (exception instanceof SuperAwesomeException) {
throw new CommonException(exception.getMessage());
}
else {
System.out.println("ERROR! caught some other exception I don't really care about");
System.out.println("Not doing anything");
}
}
}
是否有另一种方法可以从一个异常映射到另一个异常,或者我可以以某种方式告诉 JUnit 不要捕获某些异常并检查异常是否映射到正确的异常?
更新 - 我最初是如何尝试编写测试的:
public class ClassThatThrowsException {
ClassThatThrowsException() {
Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler());
}
public void doSomething() {
throw new CommonException("Something boring blew up!");
}
}
public class ClassThatThrowsExceptionTest {
@Test(expected=SuperAwesomeException.class)
public void testAwesome() {
ClassThatThrowsException c = new ClassThatThrowsException();
c.doSomething();
}
}
抛出:
java.lang.Exception: Unexpected exception, expected<SuperAwesomeException> but was<CommonException>
【问题讨论】:
-
如果您向下滚动该答案,您将找到
Unit test should test your code, not JVM specification。为什么在单元测试中需要这样的规范?单元测试通常被视为通过/失败之类的事情。 -
您应该将第一个
exception保留为新的cause。只需复制消息,您就可以摆脱堆栈跟踪,丢弃有用的信息。 -
@TimBiegeleisen 我正在尝试测试我的代码。我想测试在某些情况下会抛出异常。但我想将常见异常映射到该项目的更具体的异常。
标签: java unit-testing exception junit exception-handling