【问题标题】:Groovy wraps a java exception in its own runtime.InvokerInvocationExceptionGroovy 在自己的 runtime.InvokerInvocationException 中包装了一个 java 异常
【发布时间】:2011-07-12 00:37:00
【问题描述】:

我正在使用 groovy 为我的 java 项目编写单元测试(我建议大家尝试一下) 我的单元测试之一是测试测试代码(在 java 中)是否捕获特定类型的异常并重新引发应用程序异常:

java代码(测试中):

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

groovy 测试代码使用 groovy 的闭包映射模拟(代理)dao 调用

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

非常简单。但是,在执行测试类时,实际抛出的异常是 groovy 的 runtime.Invoker.InvocationException 包装了 DataIntegrity 异常。显然,java 代码对 groovy 及其异常一无所知,因此不执行 catch 块。 我正在使用 Netbeans 7 实际执行测试,它只是使用 groovyc 将 groovy 文件编译成 java 类,因此它只是作为普通的 JUnit 测试执行。 有谁知道如何克服这个?在 groovy 的错误中找不到它,但肯定看起来像一个。

【问题讨论】:

  • 试图重现,但不能。 DataIntegrityException 有无参数构造函数吗?
  • 不,我只是为了简洁而忽略了它。
  • 这是一个未经检查的(运行时异常),所以它应该是 new DataIntegrityViolation("message")。这不是问题,异常构造得很好,它只是被 InvocationException 包装了

标签: unit-testing testing netbeans groovy


【解决方案1】:

只是将其用于更多空间,还没有答案。我可以使用以下(最小)设置:

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)

这行得通,即,它使用 Java 6 和 Groovy 1.8 将“Caught DataIntegrityException”打印到控制台(这是我在我的机器上拥有的。至少,问题必须存在于您的代码之外的某个地方'已经发在这里了。

就个人而言,我认为您需要一些逐步调试。异常似乎是从代码中的其他地方抛出的(可能在throw new DataIntegrityException() 之前的版本中的省略号中包含的任何内容中)。

【讨论】:

  • 好吧,问题可能是groovy的版本; netbeans 的插件使用 groovy 1.6.4(不幸的是,似乎没有一种简单的方法来合并最新的 groovy jar——如果我错了,请纠正我)。不过我很好奇——如果你从你的 DAO 保存中删除 throws DataIntegrityException 声明会怎样?由于多种原因,我不能这样做,但也许 groovy 使用反射来确定它应该解开它的异常?它当然应该在没有 throws 子句的情况下工作。
  • 无论如何,您的代码基本上就是我正在测试的内容(DAO.save 上的 throws 声明除外),当然还有 groovy 版本的差异
  • @igaz:我尝试删除显式 throws 声明,但结果是一样的。 Groovy 版本似乎确实是一个可能的候选者。让我研究一下。
  • @igaz:也许these instructions 帮助在 Netbeans 中获得新版本的 Groovy?您也可以尝试改变您的模拟方法以利用 Expando 类或闭包强制,以防行为与映射强制相关。我会举一些例子。
  • 另外,您使用的是哪个版本的 Netbeans?我的印象是该插件已被弃用以支持本机 IDE (source)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 2019-12-27
  • 2019-06-14
  • 1970-01-01
  • 2023-03-02
  • 2016-04-16
相关资源
最近更新 更多