我想创建一个 ArchUnit 规则,检查类是否通过公开公共字段来破坏封装。
唯一允许的公共字段应该是一个常量,类似于public static final int MAX_USERS = 100;
其他字段不应公开
我去尝试了下面的代码:
@Test
void fieldShouldAllBePrivateToProtectEncapsulation() {
fields().should().bePrivate().check(importedClasses);
}
不幸的是,这并不起作用。
例如,它将此类标记为不好:
enum Device {
IOS,
LAPTOP
如何在 ArchUnit 中编写测试以确保除常量之外没有字段是公共的?
您需要一个额外的过滤步骤,将枚举常量从考虑范围中移除。实现此目的的一种方式如下:
它的作用是检查每个字段的所属类。如果字段的所有者(声明类)是枚举,则检查该字段是否可以分配给所讨论的枚举类型。
这应该排除所有枚举常量,但有一个轻微的副作用,即它还允许以下内容:
如果您希望允许静态最终字段也具有不同的修饰符,则检查将变为: