如何在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)]
}
答案 0 :(得分:1)
我可能不知道某些事情,但是我已经对该用例进行了快速研究。看起来不可能使用Spock的Mock
或Spy
来保留来自模拟/间谍类的注释。如果我们研究使用字节伙伴时类的Spock creates mocks/spies的使用方式,我们会发现它是原始类型的子类。如果我们深入研究默认情况下字节码伙伴的工作方式,那么我们将看到,除非另行配置,否则它不会保留原始类型的注释。默认情况下,它仅将InstrumentedType的默认工厂与subclass method ignoring annotations' retention一起使用。
我还没有在Spock的GitHub上发现任何与批注保留相关的问题。 Spock方面的修复可能看起来微不足道,但是我不确定。最好在他们的GitHub上询问。
对于一些简单的情况,这是一个非常丑陋的解决方法,您可以在Spock规范中尝试Mockito
间谍/模拟