【发布时间】:2019-12-24 21:17:43
【问题描述】:
例如,有什么方法可以测试给定的 Groovy 类是否具有注解 @Slf4j?
这是在 TDD 上下文中:在看到失败的测试之前,我不想添加注释。
【问题讨论】:
标签: groovy annotations tdd spock
例如,有什么方法可以测试给定的 Groovy 类是否具有注解 @Slf4j?
这是在 TDD 上下文中:在看到失败的测试之前,我不想添加注释。
【问题讨论】:
标签: groovy annotations tdd spock
@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 的忠实拥护者,您的回答教如何编写失败的注释测试,这正是我所追求的!
http://docs.groovy-lang.org/latest/html/gapi/groovy/transform/CompileStatic.html注解的类将指示groovy编译器像java编译器一样进行编译时检查。使用不存在的(或动态的)成员将导致编译时错误。在 TDD 的上下文中:您可以使用在使用 @Slf4j 注释类时所期望的记录器。看到编译失败然后加上@Slf4j注解,编译通过。在这种情况下,编译器就是你的测试。这有帮助吗?