gpt4 book ai didi

java - 如何模拟带注释的类?

转载 作者:行者123 更新时间:2023-11-30 05:42:28 25 4
gpt4 key购买 nike

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

传递 Spy 会使注释过滤器失败,因此无法断言任何后续逻辑。

@Unroll
def test() {
given:
def foobars = mg.findFOOBARs(mg, new Object(), 'STRING')
expect:
foobars.size() == 1
where:
mg << [new MainGroovy(), Spy(MainGroovy)]
}

最佳答案

我可能不知道某些事情,但我已经对此用例进行了快速研究。看起来不可能使用 Spock 的 MockSpy 保留来自模拟/监视类的注释。如果我们看看 Spock creates mocks/spies 是如何做到的当使用 byte-buddy 时,我们会看到它是原始类型的子类。如果我们深入研究 byte-buddy 默认情况下是如何工作的,那么我们会发现它不会保留原始类型的注释,除非另有配置。默认情况下,它仅使用 InstrumentedType 的默认工厂 subclass method ignoring annotations' retention .

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

对于简单情况来说,这是一个相当丑陋的解决方法,您可以在 Spock 规范中尝试 Mockito spock/mock

关于java - 如何模拟带注释的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55407877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com