Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing Groovy将java异常包装在自己的runtime.InvokeRivocationException中_Unit Testing_Testing_Netbeans_Groovy - Fatal编程技术网

Unit testing Groovy将java异常包装在自己的runtime.InvokeRivocationException中

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

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

java代码(正在测试中):

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

[ 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()。