Вы можете сделать это с AspectJ. Вы объявляете точку соединения (в данном случае вызов метода foo) и «смягчаете» исключение.
Редактировать Подробнее об этом:
Скажем, у вас есть следующий класс Bar
:
public class Bar {
public void foo() throws Exception {
}
}
... и у вас есть такой тест:
import junit.framework.TestCase;
public class BarTest extends TestCase {
public void testTestFoo() {
new Bar().foo();
}
}
Тогда, очевидно, тест не собирается компилироваться. Это выдаст ошибку:
Unhandled exception type Exception BarTest.java(line 6)
Теперь, чтобы преодолеть это с AspectJ, вы пишете очень простой аспект:
public aspect SoftenExceptionsInTestCode {
pointcut inTestCode() : execution(void *Test.test*());
declare soft : Exception : inTestCode();
}
Аспект в основном говорит, что любой код изнутри Test (т. Е. Метод, который начинается с «test» в классе, который заканчивается в «Test» и возвращает «void»), который выдает исключение, должен быть принят AspectJ компилятор. Если возникает исключение, оно будет упаковано и выдано компилятором AspectJ как RuntimeException
.
Действительно, если вы запустите этот тест как часть проекта AspectJ из Eclipse (с установленным AJDT), тогда тест будет успешным, тогда как без аспекта он даже не скомпилируется.