Groovy在自己的runtime.InvokerInvocationException中包装了一个java异常

时间:2011-07-12 00:37:00

标签: unit-testing testing netbeans groovy

我正在使用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的错误中,但肯定看起来像是一个。

1 个答案:

答案 0 :(得分:0)

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

<强> 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()之前版本中省略号中包含的内容。)