Я хочу написать правило ArchUnit в своем проекте J2EE, чтобы проверять, когда класс помечен @Startup, тогда он должен содержать метод, помеченный @PostConstruct.
Я попробовал это
@ArchTest
private val startUpBeansShouldHavePostConstruct: ArchRule = classes().that()
.areAnnotatedWith(Startup::class.java)
.shouldHave(methods().that().areAnnotatedWith(PostConstruct::class.java))
.because("classes with @Startup should contain a @PostConstruct annotated method")
но это не компилируется в строке mustHave(). Я немного запутался, как определить такое правило. Моя реальная цель — создать правило, гласящее, что должен быть ровно один аннотированный метод.





Вы можете удобно использовать ArchConditions.have и DescribedPredicate.describe для определения пользовательских условий и предикатов:
С
import com.tngtech.archunit.base.DescribedPredicate.describe
import com.tngtech.archunit.core.domain.JavaClass
import com.tngtech.archunit.junit.ArchTest
import com.tngtech.archunit.lang.conditions.ArchConditions.have
import com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes
вы можете использовать
@ArchTest
private val startUpBeansShouldHavePostConstruct =
classes()
.that().areAnnotatedWith(Startup::class.java)
.should(have(oneMethodAnnotatedWith(PostConstruct::class.java)))
private fun oneMethodAnnotatedWith(annotationClass: Class<out Annotation>) =
describe("one method annotated @${annotationClass.simpleName}") {
javaClass: JavaClass ->
javaClass.methods.count { it.isAnnotatedWith(annotationClass) } == 1
}
LOL, было бы разумно использовать этот параметр не только для описания! 😂 Спасибо! Я это исправил.
Спасибо за быстрый ответ. Это работает очень хорошо. Однако мне нужно было только изменить параметр в isAnnotatedWith() на annotationClass.