如何在Spock中模拟(或侦察)带注释的类,以便可以断言依赖于注释的逻辑?
Groovy中的一个人为设想的示例(也可能是Java)显示了一种检查对象集合中特定注释值的方法。想象一下在通过注释过滤后执行的更复杂的逻辑,我想通过模拟集合中的对象来断言。
@FooAnnotation('FOOBAR')
class MainGroovy {
def findFOOBARs(Object... candidates) {
candidates.findAll{ it.class.getAnnotation(FooAnnotation)?.value() == 'FOOBAR' }
//Do something with the filtered objects.
}
}
传递间谍失败了注释过滤器,因此没有任何关于任何后续逻辑的断言。
@Unroll
def test() {
given:
def foobars = mg.findFOOBARs(mg, new Object(), 'STRING')
expect:
foobars.size() == 1
where:
mg << [new MainGroovy(), Spy(MainGroovy)]
}
我可能不知道什么,但我已经对这个用例做了快速研究。看起来不可能使用Spock的Mock
或Spy
保留来自模拟/间谍类的注释。如果我们在使用byte-buddy时查看类的Spock creates mocks/spies,我们会看到它是原始类型的子类。如果我们更深入地了解byte-buddy默认如何工作,那么除非另有配置,否则我们将看到它不保留原始类型的注释。默认情况下,它只使用InstrumentedType的默认工厂和subclass method ignoring annotations' retention。
我还没有发现任何与Spock的GitHub上的注释保留有关的问题。对Spock方面的修复可能看起来很微不足道,但我不确定这一点。最好问他们的GitHub。
作为简单案例的一个非常难看的解决方法,你可以在Spock规范中尝试Mockito
spy / mock