我想编写一个 ArchUnit 测试,其内容如下:
“作为接口的类应该有一个以 Interface 结尾的名称,但不应该是@interface
(它们是注释)”。
例如,这应该是可以的:
// Interface definition
interface AnimalInterface {
void animalSound(); // abstract method
void sleep(); // abstract method
}
但这不应该
// Interface definition
interface Animal {
void animalSound(); // abstract method
void sleep(); // abstract method
}
但同时(这也是我遇到问题的部分):
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 {};
}
在本测试中不应考虑,因为它是@interface
,不是interface
。
我尝试通过编写以下代码来实现这一点:
@Test
void interfacesShouldHaveNamesEndingWithTheWordInterface() {
classes().that().areInterfaces().should().haveNameMatching(".*Interface").check(importedClasses);
}
但这对于该@interface
部分来说会失败。
如何增强测试以“忽略”“过滤掉”注释?
您可以使用
DescribedPredicate<JavaClass>
JavaClass.Predicates.ANNOTATIONS
或者 s 的相应流畅 APIArchRule
从规则中排除注释: