ArchUnit
ArchUnit is a free, simple, and extensible Java architecture test library. It verifies architectural rules by analysing compiled bytecode — no source code access needed.
Specs Using ArchUnit
| Spec |
Description |
Priority |
| ARCH-001 |
Layering: Controller → Service → Repository |
critical |
| ARCH-002 |
Dependency Inversion at Service Boundary |
major |
| ARCH-003 |
Package Structure by Feature |
major |
Quick Start
Maven
<dependency>
<groupId>com.tngtech.archunit</groupId>
<artifactId>archunit-junit5</artifactId>
<version>1.5.0</version>
<scope>test</scope>
</dependency>
Basic Test
@AnalyzeClasses(packages = "com.example.myapp")
public class ArchitectureTest {
@ArchTest
static final ArchRule layered_architecture = layeredArchitecture()
.consideringAllDependencies()
.layer("Controller").definedBy("..controller..")
.layer("Service").definedBy("..service..")
.layer("Repository").definedBy("..repository..")
.whereLayer("Controller").mayNotBeAccessedByAnyLayer()
.whereLayer("Service").mayOnlyBeAccessedByLayers("Controller")
.whereLayer("Repository").mayOnlyBeAccessedByLayers("Service");
}
Guides
Key Concepts
| Concept |
Description |
@AnalyzeClasses |
Declares which packages to import and analyse |
@ArchTest |
Marks a field or method as an architecture test |
ArchRule |
A fluent rule definition (e.g. noClasses()...should()...) |
FreezingArchRule |
Freezes existing violations, only fails on new ones |
ArchTests |
Groups rules from another class for reuse |
Trigger Policy
ArchUnit tests run as standard JUnit tests — they execute with mvn test on every push. No separate CI step needed.