ArchUnit обеспечивает наличие аннотации - PullRequest
0 голосов
/ 04 ноября 2019

Учитывая ArchUnit библиотека в версии 0,12 :

Возможно ли протестировать сценарий "методы, аннотированные A, также должны быть аннотированы Bили быть объявленным в типе, помеченном B "?

Пример:

A.java

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface A {
}

B. java

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface B {
}

TestCases.java

public class TestCases {

    static class ShouldFail {

        @A
        public void m() {
        }
    }

    static class ShouldPass {

        @A
        @B
        public void m() {
        }
    }

    @B
    static class ShouldPassToo {

        @A
        public void m() {
        }
    }
}

Что я пробовал?

Я думал, что ArchConditions.beDeclaredInClassesThatбудет делать эту работу, поэтому я подготовил следующее правило:

MethodsShouldConjunction rule = methods()
    .that()
    .areAnnotatedWith(A.class)
    .should()
    .beAnnotatedWith(B.class)
    .orShould(beDeclaredInClassesThat(areAnnotatedWith(B.class))); //<-- doesn't compile

... но, очевидно, я неправильно понял цель упомянутого метода. Javadoc этой утилиты вообще не помог. Могу ли я заменить последнюю строку на что-нибудь работающее, удовлетворяющее утверждению «методы, объявленные в типе, помеченном B»?

1 Ответ

2 голосов
/ 08 ноября 2019

Оказалось, я безуспешно пытался передать параметр в метод orShould. Для достижения моей цели правило должно быть расширено с использованием методов без параметров:

methods()
    .that()
    .areAnnotatedWith(A.class)
    .should()
    .beAnnotatedWith(B.class)
    .orShould()
    .beDeclaredInClassesThat()
    .areAnnotatedWith(B.class);
...