问题描述
class SomeClass {
String myProperty = 'foo'
}
通常,使用属性名称或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共享库进行了一些单元测试-但是缺少的是一种检测属性访问的方法,简而言之:一种禁止属性访问的方法,因此单元测试将已经提前发生
解决方法
以下代码:
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 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)
...