我想在命名空间原因中定义类BarException
内的Foo
。这就是我的Foo
类的样子:
package org.company.utils
class Foo {
class BarException extends RuntimeException { }
def raise() {
def r = new RuntimeException("BOOM")
throw new BarException(r)
}
}
这就是我喜欢它的方式:
void testFoo() {
shouldFail(Foo.BarException) {
def foo = new Foo()
foo.raise()
}
}
但测试失败了:
1)testFoo(test.FooTestCase)java.lang.AssertionError:Closure test.FooTestCase$_testFoo_closure1@3eb25e1a应该失败了 类型为org.company.utils.Foo $ BarException的异常,而不是 异常groovy.lang.GroovyRuntimeException:找不到匹配项 构造函数: org.company.utils.Foo $ BarException(org.company.utils.Foo, 了java.lang.RuntimeException)
我已尝试使用new BarException(this, r)
实例化BarException,并将groovy.transform.InheritConstructors
放在BarException
周围,但对编译器没有任何作用。
有什么问题?
答案 0 :(得分:0)
尝试将BarException设为静态并添加@InheritConstructors
。
import groovy.transform.InheritConstructors
class Foo {
@InheritConstructors
static class BarException extends Exception { }
def raise() {
Throwable r = new RuntimeException("BOOM")
throw new BarException(r)
}
}
来自groovy docs:
静态内部类的使用是最受支持的。如果你 绝对需要一个内部类,你应该把它变成一个静态类。