我正在使用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的错误中,但肯定看起来像是一个。
答案 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()
之前版本中省略号中包含的内容。)