Gestern wurde ArchUnit in Version 0.18.0 veröffentlicht.
Wenn das keine Grund ist mal zu zeigen, wie man eine Package-Abhängigkeit überprüfen kann.
Also wir wollen einen Test schreiben, der durchläuft wenn nur aus dem Package blockchain auf das Package be zugegriffen wird. Wie hier im UML Diagramm gezeigt:…
Umgekehrt soll der Testfall fehlschlagen. In Junit 5 geht das mit einem 2 Zeiler. Hier die ganze Testklasse:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
package de.wenzlaff.blockchain; import com.tngtech.archunit.junit.AnalyzeClasses; import com.tngtech.archunit.junit.ArchTest; import com.tngtech.archunit.lang.ArchRule; // static Import nötig: import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses; /** * Architektur vorgaben. * * Siehe https://www.archunit.org/userguide/html/000_Index.html * * @author Thomas Wenzlaff */ @AnalyzeClasses(packages = "de.wenzlaff.blockchain") // Annotation des Package public class ArchitekturPackageTest { /** * Das be Package darf nicht auf das Blockchain Package zugreifen. Nur * umgekehrt. */ @ArchTest // nötige Annotation mit Regel public static final ArchRule Package_BE_Rule = noClasses().that().resideInAPackage("..be..").should().dependOnClassesThat() .resideInAPackage("..blockchain.."); } |
Interessant ist auch, wie das UML zeigt, das die ArchUnit Validierung keine statischen Abhängigkeiten zu den beiden Packages hat. Das läuft alles über Reflections und Classpath-Scann.
Natürlich brauchen wir noch ArchUnit in der pom.xml, aber nur mit Test Scope:
1 2 3 4 5 6 |
<dependency> <groupId>com.tngtech.archunit</groupId> <artifactId>archunit-junit5</artifactId> <version>0.18.0</version> <scope>test</scope> </dependency> |
Das ganze Blockchain Beispiel-Projekt gibt es hier.