Groovy оборачивает исключение Java в собственное время выполнения. InvokerInvocationException - PullRequest
0 голосов
/ 12 июля 2011

Я использую groovy для написания модульных тестов для моего проекта Java (я бы посоветовал всем попробовать его). Один из моих модульных тестов - это тестирование того, что тестируемый код (в Java) ловит исключение определенного типа исбрасывает исключение приложения:

java-код (в тесте):

try
{
    dao.save(obj)
}
catch(DataIntegrityException dupex)
{
    ....
    throw new AppException("duplicate name");
}

Groovy-тестовый код проверяет (прокси) вызов dao, используя карту замыканий groovy

[ save:
  { obj->
    ...
    throw new DataIntegrityException("duplicate"); //DataIntegrityException is a runtime exception (unchecked)
  }    
] as DAO;

Довольно просто.Однако при выполнении тестового класса фактическое выбрасываемое исключение представляет собой время выполнения groovy.Invoker.InvocationException, которое оборачивает исключение DataIntegrity.Очевидно, что Java-код ничего не знает о groovy и его исключениях, поэтому блок catch не выполняется.Я использую Netbeans 7 для фактического выполнения теста, и он просто использует groovyc для компиляции файла groovy в класс java, поэтому он просто выполняется как обычный тест JUnit.Кто-нибудь знает, как это преодолеть?не удалось найти его в списке ошибок Groovy, но, похоже, он один.

1 Ответ

0 голосов
/ 12 июля 2011

Просто используйте это для немного большего пространства, но пока нет ответа. Я могу получить следующие (минимальные) настройки для работы:

Dao.java

public interface Dao { void save(Object obj) throws DataIntegrityException; }

DataIntegrityException.java

public class DataIntegrityException extends RuntimeException {
    public DataIntegrityException(String str) { super(str); }
}

Test.java

public class Test {
    public void doIt(Dao dao) {
        try {
            dao.save(new Object());
        } catch (DataIntegrityException e) {
            System.out.println("Caught DataIntegrityException")
        }
    }
}

test_case.groovy

d = [save: { throw new DataIntegrityException('duplicate') }] as Dao
new Test().doIt(d)

Это работает, т. Е. Выводит «Caught DataIntegrityException» на консоль, используя Java 6 и Groovy 1.8 (это то, что у меня есть на моей машине. По крайней мере, проблема должна лежать где-то за пределами кода, который вы '' Мы разместили здесь.

Лично я думаю, вам понадобится пошаговая отладка. Представляется вероятным, что исключение выдается из другого места в коде (возможно, из того, что содержится в эллипсах в вашей версии до throw new DataIntegrityException()).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...