Spock:测试Groovy类是否有特定的注释?

Spock:测试Groovy类是否有特定的注释?,groovy,annotations,tdd,spock,Groovy,Annotations,Tdd,Spock,例如,有什么方法可以测试给定的Groovy类是否有注释 这是在TDD上下文中:在看到失败的测试之前,我不想添加注释。该@Slf4j注释具有@Retention(SOURCE)。因此,注释信息在运行时不可用。这使得测试几乎不可能。您可以读取源文件并在测试中对其进行解析,然后检查是否存在@Slf4j注释 使用带有@Retention(RUNTIME)的批注将改变图片: class AnnotationSpec extends Specification{ void "test that c

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


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

@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创造了优秀的微观软件设计,但忽略了宏观设计,而宏观设计是软件最重要的部分

我同意这个答案。只是一个相关的注释:您可以做的是实际测试被测类中是否存在非空的
私有最终静态记录器日志
(有时也是
瞬态
,但并不总是),即,您不测试源保留注释,而是测试其效果。还有一种方法可以模拟测试记录器,如果您想监视最后一个类,请参阅。谢谢。我不太清楚你在说什么
CompileStatic
,但我确实理解你关于盲目遵循TDD的观点。也许
Slf4j
不是一个很好的例子(一个人们可能想要测试的注释),并且可能会被指责测试实现细节而不是功能@因此,克里加克斯的“变通”可能更为明智。然而,我是TDD的忠实粉丝,你的答案教我如何编写一个失败的注释测试,这正是我所追求的@克里加克斯:完全可以@Mikoverent:一个用
http://docs.groovy-lang.org/latest/html/gapi/groovy/transform/CompileStatic.html
将指示groovy编译器像java编译器一样进行编译时检查。使用不存在(或动态)的成员将导致编译时错误。在TDD上下文中:您可以使用使用
@Slf4j
注释类时所需的记录器。查看编译失败,然后添加
@Slf4j
注释并使编译通过。在本例中,编译器是您的测试。那有用吗?