【问题标题】:Spock: test that a Groovy class has a certain annotation?Spock:测试一个 Groovy 类是否有某个注解?
【发布时间】:2019-12-24 21:17:43
【问题描述】:

例如,有什么方法可以测试给定的 Groovy 类是否具有注解 @Slf4j

这是在 TDD 上下文中:在看到失败的测试之前,我不想添加注释。

【问题讨论】:

    标签: groovy annotations tdd spock


    【解决方案1】:

    @Slf4j 注释具有@Retention(SOURCE)。所以注释信息在运行时不可用。这使得测试几乎不可能。您可以阅读源文件并在测试中对其进行解析,并检查是否有 @Slf4j 注释。

    带有@Retention(RUNTIME) 的注释会改变图片:

    class AnnotationSpec extends Specification{
    
        void "test that class has annotation"() {
            given:
            def annotation = ShouldHaveAnnotation.class.getAnnotation(ClassAnnotation)
    
            expect:
            annotation != null
        }
    }
    
    @Target([TYPE])
    @Retention(RetentionPolicy.RUNTIME)
    @interface ClassAnnotation{
    
    }
    
    @ClassAnnotation
    class ShouldHaveAnnotation {
    
    }
    

    到目前为止,基于事实的答案。

    我对 TDD 的看法:

    您的测试用例的含义是什么?你只是想盲目地遵循TDD吗?

    每个所谓的软件工艺工作流程都是由软件开发与 1800 世纪家具制造相关的假设推动的。 我知道如何建造家具,燕尾是最坚固的接头,看起来很棒,但很贵。饼干联合是现代的,看起来不那么漂亮,但也很结实而且便宜。 所以我根据自己的经验决定是选择燕尾还是现代饼干接头。

    我通常不测试不会造成麻烦的东西。我怎么知道,..很好的经验。只需在您的类上使用@CompileStatic 注释,编译器就会捕获丢失的日志实例,或者只需编写一个调用使用记录器的方法的测试。

    TDD 的一个标志是优秀设计的来源:TDD 创造了优秀的微观软件设计,但忽略了宏观设计,这是软件最重要的部分。

    【讨论】:

    • 我同意这个答案。只是一个相关的评论:你可以做的是在被测类中实际测试非空private final static Logger log(有时也是transient,但并非总是如此)的存在,即你不测试源保留注释,但为了它的效果。还有一种方法可以使用一点反射魔法来模拟测试该记录器,如果您想监视最后一堂课,可能还有@Delegate,请参阅my other answer
    • 谢谢。我不太清楚你在说什么CompileStatic,但我确实理解你关于盲目遵循 TDD 的观点。也许Slf4j 不是一个很好的例子(一个可能想要测试的注释),并且对测试实现细节而不是功能的指责持开放态度。因此,@kriegaex 的“解决方法”可能更明智。但是,我是 TDD 的忠实拥护者,您的回答教如何编写失败的注释测试,这正是我所追求的!
    • @kriegaex:完全没问题!
    • @mikerodent:一个用http://docs.groovy-lang.org/latest/html/gapi/groovy/transform/CompileStatic.html注解的类将指示groovy编译器像java编译器一样进行编译时检查。使用不存在的(或动态的)成员将导致编译时错误。在 TDD 的上下文中:您可以使用在使用 @Slf4j 注释类时所期望的记录器。看到编译失败然后加上@Slf4j注解,编译通过。在这种情况下,编译器就是你的测试。这有帮助吗?
    猜你喜欢
    • 2016-07-13
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多