Unit testing Groovy将java异常包装在自己的runtime.InvokeRivocationException中
我正在使用groovy为我的java项目编写单元测试(我建议所有人都尝试一下) 我的一个单元测试是测试被测试代码(java)是否捕获特定类型的异常并重新引发应用程序异常: java代码(正在测试中): groovy测试代码使用groovy的闭包映射模拟(代理)dao调用Unit testing Groovy将java异常包装在自己的runtime.InvokeRivocationException中,unit-testing,testing,netbeans,groovy,Unit Testing,Testing,Netbeans,Groovy,我正在使用groovy为我的java项目编写单元测试(我建议所有人都尝试一下) 我的一个单元测试是测试被测试代码(java)是否捕获特定类型的异常并重新引发应用程序异常: java代码(正在测试中): groovy测试代码使用groovy的闭包映射模拟(代理)dao调用 [ save: { obj-> ... throw new DataIntegrityException("duplicate"); //DataIntegrityException is a runt
[ save:
{ obj->
...
throw new DataIntegrityException("duplicate"); //DataIntegrityException is a runtime exception (unchecked)
}
] as DAO;
很简单。但是,在执行测试类时,实际引发的异常是groovy的runtime.Invoker.invokeException,它封装了DataIntegrity异常。显然,java代码对groovy及其异常一无所知,因此不会执行catch块。
我使用Netbeans 7来实际执行测试,它只使用groovyc将groovy文件编译成java类,因此它只是作为普通JUnit测试执行。
有人知道如何克服这个问题吗?在groovy的bugs中找不到它,但看起来确实像一个。只是用它来增加一点空间,还没有答案。我可以使用以下(最少)设置: Dao.java
public interface Dao { void save(Object obj) throws DataIntegrityException; }
public class DataIntegrityException extends RuntimeException {
public DataIntegrityException(String str) { super(str); }
}
public class Test {
public void doIt(Dao dao) {
try {
dao.save(new Object());
} catch (DataIntegrityException e) {
System.out.println("Caught DataIntegrityException")
}
}
}
DataIntegrityException.java
public interface Dao { void save(Object obj) throws DataIntegrityException; }
public class DataIntegrityException extends RuntimeException {
public DataIntegrityException(String str) { super(str); }
}
public class Test {
public void doIt(Dao dao) {
try {
dao.save(new Object());
} catch (DataIntegrityException e) {
System.out.println("Caught DataIntegrityException")
}
}
}
Test.java
public interface Dao { void save(Object obj) throws DataIntegrityException; }
public class DataIntegrityException extends RuntimeException {
public DataIntegrityException(String str) { super(str); }
}
public class Test {
public void doIt(Dao dao) {
try {
dao.save(new Object());
} catch (DataIntegrityException e) {
System.out.println("Caught DataIntegrityException")
}
}
}
测试案例groovy
d = [save: { throw new DataIntegrityException('duplicate') }] as Dao
new Test().doIt(d)
这是可行的,也就是说,它使用Java 6和Groovy 1.8(这是我机器上的版本)将“捕获的DataIntegrityException”打印到控制台。至少,这个问题一定在您发布的代码之外
就个人而言,我认为您需要一步一步地调试。异常可能是从代码中的其他地方抛出的(可能是在
抛出新DataIntegrityException()之前版本中省略号中包含的任何内容中).尝试复制,但无法复制。DataIntegrityException
是否有无参数构造函数?不,为了简洁起见,我将其忽略。它是未选中的(运行时异常),因此应该是新的DataIntegrityViolation(“消息”)这不是问题,异常构造得很好,只是被调用异常包装好了。问题可能是groovy的版本;netbeans的插件使用groovy 1.6.4(不幸的是,似乎没有简单的方法可以合并最新的groovy jar——如果我错了,请有人纠正我).但我很好奇--如果从DAO save中删除throws-DataIntegrityException声明会怎么样?由于各种原因,在我的例子中我不能这样做,但groovy可能使用反射来发现它应该打开它的异常?它当然应该在没有throws子句的情况下工作。无论如何,您的代码本质上就是我想要的'm测试(DAO.save上的抛出声明除外)当然还有groovy版本differences@igaz:我尝试删除显式抛出声明,但结果是一样的。Groovy版本似乎是一个很可能的候选版本。让我来研究一下。@igaz:也许有助于在Netbeans中获得Groovy的新版本?您也可以尝试改变模拟方法,以利用Expando
类或闭包强制,以防行为与映射强制相关联。我将举一些例子。另外,您使用的是什么版本的Netbeans?我的印象是,该插件被弃用,转而支持本机IDE()。