Gostaria de criar uma regra ArchUnit que verifica se uma classe não está quebrando o encapsulamento ao expor um campo público.
O único campo público permitido deve ser uma constante, algo comopublic static final int MAX_USERS = 100;
Outros campos não devem ser públicos
Fui tentar o seguinte código:
@Test
void fieldShouldAllBePrivateToProtectEncapsulation() {
fields().should().bePrivate().check(importedClasses);
}
Infelizmente isso não funciona.
Por exemplo, ele está sinalizando esta classe como ruim:
enum Device {
IOS,
LAPTOP
Como posso escrever um teste no ArchUnit para garantir que nenhum campo seja público, exceto constante?
O que você precisa é de uma etapa de filtro extra que remova constantes enum de consideração. Uma maneira de fazer isso é a seguinte:
O que isso faz é verificar a classe proprietária de cada campo em consideração. Se o proprietário do campo (a classe declarante) for um enum, então ele verifica se o campo é atribuível ao tipo enum em questão.
Isso deve excluir todas as constantes de enumeração, mas tem um pequeno efeito colateral: também permite o seguinte:
Se você quiser permitir que campos finais estáticos também tenham modificadores diferentes, a verificação se torna: