Java ArchUnit:在getMethodCallsFromSelf方法上检测注释

时间:2019-03-02 14:18:53

标签: java archunit

我用自定义注释为一些方法添加了注释:“ ExistForTesting”

@Documented
@Target({TYPE, FIELD, METHOD})
@Retention(SOURCE)
public @interface ExistForTesting {
    String why() default "";
}

我想编写一个(Junit5 + ArchUnit)单元测试,以确保仅从单元测试中使用ExistForTesting注释方法。因此,我编写了给定的测试:

ArchCondition<JavaClass> NOT_CALL_TEST_METHODS =
    new ArchCondition<JavaClass>("not call methods annotated with ExistForTesting") {
        @Override
        public void check(@NotNull JavaClass item, ConditionEvents events) {
            item.getMethodCallsFromSelf().stream().filter(method -> method.getTarget().isAnnotatedWith(ExistForTesting.class))
                .forEach(method -> {
                    String message = String.format(
                        "Method %s is annotated with ExistForTesting",
                        method.getTarget().getFullName());
                    events.add(SimpleConditionEvent.violated(method, message));
                });
        }
    };

@Test
public void shouldNotUseTestMethods() {
    classes().that()
        .haveSimpleNameNotEndingWith("Test")
        .should(NOT_CALL_TEST_METHODS)
        .check(appClasses);
}

问题:未检测到我的注释。
调试器找到方法调用,但是method.getTarget().isAnnotatedWith(ExistForTesting.class))总是返回false

我在做什么错了?

1 个答案:

答案 0 :(得分:0)

好的,我的注释保留设置为SOURCE而不是CLASS。
固定。