如何模拟带注释的类?

问题描述 投票:1回答:1

如何在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)]
}
java groovy annotations mocking spock
1个回答
1
投票

我可能不知道什么,但我已经对这个用例做了快速研究。看起来不可能使用Spock的MockSpy保留来自模拟/间谍类的注释。如果我们在使用byte-buddy时查看类的Spock creates mocks/spies,我们会看到它是原始类型的子类。如果我们更深入地了解byte-buddy默认如何工作,那么除非另有配置,否则我们将看到它不保留原始类型的注释。默认情况下,它只使用InstrumentedType的默认工厂和subclass method ignoring annotations' retention

我还没有发现任何与Spock的GitHub上的注释保留有关的问题。对Spock方面的修复可能看起来很微不足道,但我不确定这一点。最好问他们的GitHub。

作为简单案例的一个非常难看的解决方法,你可以在Spock规范中尝试Mockito spy / mock

© www.soinside.com 2019 - 2024. All rights reserved.