Skip to content

Commit f384e1a

Browse files
committed
add ArchUnit examples
1 parent dc39a42 commit f384e1a

File tree

4 files changed

+88
-0
lines changed

4 files changed

+88
-0
lines changed

spring-boot-example/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
<selenide.version>7.7.0</selenide.version>
3333
<selenium.version>4.27.0</selenium.version>
3434
<awaitility.version>4.2.2</awaitility.version>
35+
<archunit.version>1.3.0</archunit.version>
3536
<rest-assured.version>5.5.0</rest-assured.version>
3637
<greenmail.version>2.1.2</greenmail.version>
3738
<groovy.version>4.0.24</groovy.version>
@@ -275,6 +276,11 @@
275276
<artifactId>rest-assured</artifactId>
276277
<scope>test</scope>
277278
</dependency>
279+
<dependency>
280+
<groupId>com.tngtech.archunit</groupId>
281+
<artifactId>archunit-junit5</artifactId>
282+
<version>${archunit.version}</version>
283+
</dependency>
278284

279285
<!-- Performance Testing -->
280286
<dependency>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package de.rieckpil.blog.controller;
2+
3+
public class SomeController {
4+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package de.rieckpil.blog.service;
2+
3+
public class SomeService {
4+
5+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package de.rieckpil.blog.archunit;
2+
3+
import java.time.Clock;
4+
import java.time.LocalDate;
5+
6+
import com.tngtech.archunit.core.domain.JavaClasses;
7+
import com.tngtech.archunit.core.importer.ClassFileImporter;
8+
import com.tngtech.archunit.core.importer.ImportOption;
9+
import com.tngtech.archunit.lang.ArchRule;
10+
import com.tngtech.archunit.lang.syntax.ArchRuleDefinition;
11+
import com.tngtech.archunit.library.dependencies.SlicesRuleDefinition;
12+
import org.junit.jupiter.api.Test;
13+
14+
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;
15+
16+
class ArchitectureTest {
17+
18+
@Test
19+
void servicesShouldNotDependOnControllers() {
20+
JavaClasses importedClasses = new ClassFileImporter().importPackages("de.rieckpil.blog");
21+
22+
noClasses()
23+
.that().resideInAPackage("de.rieckpil.blog.service")
24+
.should().dependOnClassesThat().resideInAPackage("de.rieckpil.blog.controller")
25+
.check(importedClasses);
26+
}
27+
28+
@Test
29+
void localDateNowShouldUseClock() {
30+
ArchRule rule = noClasses().should()
31+
.callMethod(LocalDate.class, "now");
32+
33+
rule.check(new ClassFileImporter()
34+
.withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS)
35+
.importPackages("de.rieckpil"));
36+
}
37+
38+
@Test
39+
void noCyclicDependencies() {
40+
JavaClasses importedClasses = new ClassFileImporter().importPackages("de.rieckpil");
41+
42+
SlicesRuleDefinition.slices()
43+
.matching("de.rieckpil.(*)..")
44+
.should().beFreeOfCycles()
45+
.check(importedClasses);
46+
}
47+
48+
@Test
49+
void serviceClassesShouldHaveProperNaming() {
50+
JavaClasses importedClasses = new ClassFileImporter().importPackages("de.rieckpil");
51+
52+
ArchRuleDefinition.classes()
53+
.that().resideInAPackage("de.rieckpil.blog.service")
54+
.should().haveSimpleNameEndingWith("Service")
55+
.check(importedClasses);
56+
}
57+
58+
@Test
59+
void shouldNotUseJavaUtilLogging() {
60+
JavaClasses importedClasses = new ClassFileImporter()
61+
.withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS)
62+
.importPackages("de.rieckpil");
63+
64+
noClasses()
65+
.should().dependOnClassesThat().belongToAnyOf(java.util.logging.Logger.class)
66+
.check(importedClasses);
67+
}
68+
69+
public static final ArchRule serviceLayerShouldNotAccessRepositoriesDirectly =
70+
noClasses()
71+
.that().resideInAPackage("de.rieckpil")
72+
.should().dependOnClassesThat().resideInAPackage("de.rieckpil");
73+
}

0 commit comments

Comments
 (0)