如何模拟带注释的类?

时间:2019-03-28 22:38:22

标签: java groovy annotations mocking spock

如何在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)]
}

1 个答案:

答案 0 :(得分:1)

我可能不知道某些事情,但是我已经对该用例进行了快速研究。看起来不可能使用Spock的MockSpy来保留来自模拟/间谍类的注释。如果我们研究使用字节伙伴时类的Spock creates mocks/spies的使用方式,我们会发现它是原始类型的子类。如果我们深入研究默认情况下字节码伙伴的工作方式,那么我们将看到,除非另行配置,否则它不会保留原始类型的注释。默认情况下,它仅将InstrumentedType的默认工厂与subclass method ignoring annotations' retention一起使用。

我还没有在Spock的GitHub上发现任何与批注保留相关的问题。 Spock方面的修复可能看起来微不足道,但是我不确定。最好在他们的GitHub上询问。

对于一些简单的情况,这是一个非常丑陋的解决方法,您可以在Spock规范中尝试Mockito间谍/模拟

相关问题