Slide 58
Slide 58 text
ARCHUNIT VERBOSE SYNTAX
@Test
fun `classes with 'UseCase' suffix should have single method named ‘invoke'`() {
classes()
.that().haveSimpleNameEndingWith("UseCase")
.should(haveOnePublicMethodWithName("invoke"))
.check(allClasses)
} fun haveOnePublicMethodWithName(methodName: String) =
object : ArchCondition("have exactly one public method named '$methodName'") {
override fun check(javaClass: JavaClass, conditionEvents: ConditionEvents) {
val publicMethods = javaClass
.methods
.filter { it.modifiers.contains(JavaModifier.PUBLIC) }
if (publicMethods.size == 1) {
val method = publicMethods[0]
// When method accepts Kotlin value class then Kotlin will generate
// a random suffix to the method name e.g. methodName-suffix
val methodExists = method.name == methodName || method.name.startsWith("$methodName-")
if (!methodExists) {
val message: String = createMessage(
javaClass,
"contains does not have method named '${method.name}' ${method.sourceCodeLocation}",
)
conditionEvents.add(violated(javaClass, message))
}
} else {
val message: String = createMessage(
javaClass,
"contains multiple public methods",
)
conditionEvents.add(violated(javaClass, message))
}
}
}