Gostaria de escrever um teste ArchUnit que diz:
"as classes que são interfaces devem ter um nome terminado com Interface, mas não as @interface
que são (são anotações)".
Por exemplo, isto deve estar OK:
// Interface definition
interface AnimalInterface {
void animalSound(); // abstract method
void sleep(); // abstract method
}
Mas isso não deveria
// Interface definition
interface Animal {
void animalSound(); // abstract method
void sleep(); // abstract method
}
Mas também (e é nessa parte que estou tendo problemas):
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Constraint(validatedBy = SomethingValidator.class)
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidSomething {
String message() default "Invalid request data";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Não deve ser levado em consideração neste teste, pois @interface
não é interface
.
Tentei fazer isso escrevendo o seguinte código:
@Test
void interfacesShouldHaveNamesEndingWithTheWordInterface() {
classes().that().areInterfaces().should().haveNameMatching(".*Interface").check(importedClasses);
}
Mas isso não daria certo @interface
.
Como melhorar o teste para "ignorar" e "filtrar" anotações?
Você pode usar o
DescribedPredicate<JavaClass>
JavaClass.Predicates.ANNOTATIONS
, ou a API fluente correspondente paraArchRule
s, para excluir anotações da sua regra: