0

让我们有一个时髦的类,比如:

class SomeClass {
    String myProperty = 'foo'
}

通常在 groovy 中,使用属性名称或 getter 访问值是完全有效的——这通常会给出相同的结果SomeClass

SomeClass someClass = new SomeClass()
assert someClass.myProperty == 'foo'
assert someClass.getMyProperty() == 'foo'

但是 - 由于 Jenkins Pipeline 实现中的缺陷 - 有时(!)您被迫使用 getter - 因为普通属性访问将不起作用(使用某些类层次结构时),请参阅:JENKINS-47143。坏事是相同的代码可能适用于某些工作,而它不适用于其他工作:

SomeClass someClass = new SomeClass()
assert someClass.myProperty == 'foo' // sometimes throws 'property not found' error
assert someClass.getMyProperty() == 'foo'

现在我已经为我们的 Jenkins 共享库进行了几个单元测试——但缺少的是一种检测属性访问的方法,简而言之:一种禁止属性访问的方法,因此单元测试已经提前抱怨。

4

1 回答 1

1

以下代码:

class SomeClass { 
  String myProperty = 'foo'
}

SomeClass.metaClass.getProperty = { String name -> 
  throw new RuntimeException("tried to get property ${name}, property access only allowed via getXX() methods")
}

def s = new SomeClass()

println(s.myProperty)       // a
println(s.getMyProperty())  // b

将为 a 行抛出异常,但不会为 b 行抛出异常。我怀疑如果 SomeClass 是用 java 编写的,这将是不可能的,但假设一个 groovy 类,这可能是实现你想要的一种方法。

运行上述将导致:

─➤ groovy solution.groovy
Caught: java.lang.RuntimeException: tried to get property myProperty, property access only allowed via getXX() methods
java.lang.RuntimeException: tried to get property myProperty, property access only allowed via getXX() methods
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
...
于 2020-10-21T10:20:16.247 回答