From 4add26ff52efc0eede8931853289eb3dadd1c26e Mon Sep 17 00:00:00 2001 From: XXNitram Date: Tue, 10 Mar 2020 16:36:00 +0100 Subject: [PATCH] Rename ArchUnitTest to LayeredArchitectureTest and define/test a layered Architecture --- .../gruppen2/architecture/ArchUnitTest.java | 91 ------------------- .../architecture/LayeredArchitectureTest.java | 39 ++++++++ 2 files changed, 39 insertions(+), 91 deletions(-) delete mode 100644 src/test/java/mops/gruppen2/architecture/ArchUnitTest.java create mode 100644 src/test/java/mops/gruppen2/architecture/LayeredArchitectureTest.java diff --git a/src/test/java/mops/gruppen2/architecture/ArchUnitTest.java b/src/test/java/mops/gruppen2/architecture/ArchUnitTest.java deleted file mode 100644 index 2d0b315..0000000 --- a/src/test/java/mops/gruppen2/architecture/ArchUnitTest.java +++ /dev/null @@ -1,91 +0,0 @@ -package mops.gruppen2.architecture; - -import com.tngtech.archunit.junit.AnalyzeClasses; -import com.tngtech.archunit.junit.ArchIgnore; -import com.tngtech.archunit.junit.ArchTest; -import com.tngtech.archunit.lang.ArchRule; -import org.springframework.data.repository.CrudRepository; -import org.springframework.stereotype.Controller; -import org.springframework.stereotype.Service; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes; -import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses; - -@AnalyzeClasses(packages = "mops.gruppen2") -public class ArchUnitTest { - - @ArchTest - public static final ArchRule controllerClassesShouldBeAnnotatedWithControllerOrRestControllerAnnotation = classes() - .that().haveSimpleNameEndingWith("Controller") - .should().beAnnotatedWith(Controller.class) - .orShould().beAnnotatedWith(RestController.class); - - @ArchTest - public static final ArchRule controllerClassesShouldHaveControllerInName = classes() - .that().areAnnotatedWith(Controller.class) - .or().areAnnotatedWith(RestController.class) - .should().haveSimpleNameEndingWith("Controller"); - - @ArchTest - public static final ArchRule controllerClassesShouldBeInControllerPackage = classes() - .that().areAnnotatedWith(Controller.class) - .or().areAnnotatedWith(RestController.class) - .should().resideInAPackage("..controller.."); - - @ArchTest - public static final ArchRule noClassesWithControllerOrRestControllerAnnotationShouldResideOutsideOfControllerPackage = noClasses() - .that().areAnnotatedWith(Controller.class) - .or().areAnnotatedWith(RestController.class) - .should().resideOutsideOfPackage("..controller.."); - - @ArchTest - public static final ArchRule controllerClassesShouldHaveRequestMappingAnnotation = classes() - .that().resideInAPackage("..controller..") - .and().haveSimpleNameEndingWith("Controller") - .and().areAnnotatedWith(Controller.class) - .or().areAnnotatedWith(RestController.class) - .should().beAnnotatedWith(RequestMapping.class); - - @ArchTest - public static final ArchRule controllerClassesShouldNotDependOnEachOther = noClasses() - .that().haveSimpleNameEndingWith("Controller") - .should().dependOnClassesThat().haveNameMatching("Controller"); - - @ArchTest - public static final ArchRule serviceClassesShouldHaveServiceInName = classes() - .that().areAnnotatedWith(Service.class) - .should().haveSimpleNameEndingWith("Service"); - - @ArchTest - public static final ArchRule serviceClassesShouldBeAnnotatedWithService = classes() - .that().haveSimpleNameEndingWith("Service") - .should().beAnnotatedWith(Service.class); - - @ArchTest - public static final ArchRule serviceClassesShouldBeInServicePackage = classes() - .that().areAnnotatedWith(Service.class) - .should().resideInAPackage("..service.."); - - @ArchTest - public static final ArchRule serviceClassesShouldOnlyBeAccessedByControllerOrServiceClasses = classes() - .that().resideInAPackage("..service..") - .should().onlyBeAccessed().byAnyPackage("..controller..", "..service.."); - - @ArchTest - public static final ArchRule domainClassesShouldNotAccessOtherClasses = noClasses() - .that().resideInAPackage("..domain..") - .should().accessClassesThat().resideInAnyPackage("..controller..", "..repository..", "..security..", "..service.."); - - @ArchTest - public static final ArchRule repositoryClassesThatImplementCrudRepositoryShouldBeNamedRepository = classes() - .that().implement(CrudRepository.class) - .should().haveSimpleNameEndingWith("Repository"); - - @ArchTest - public static final ArchRule repositoryClassesShouldBeInRepositoryPackage = classes() - .that().haveSimpleNameEndingWith("Repository") - .should().resideInAPackage("..repository.."); - -} diff --git a/src/test/java/mops/gruppen2/architecture/LayeredArchitectureTest.java b/src/test/java/mops/gruppen2/architecture/LayeredArchitectureTest.java new file mode 100644 index 0000000..f4c7b97 --- /dev/null +++ b/src/test/java/mops/gruppen2/architecture/LayeredArchitectureTest.java @@ -0,0 +1,39 @@ +package mops.gruppen2.architecture; + + import com.tngtech.archunit.core.importer.ImportOption; + import com.tngtech.archunit.junit.AnalyzeClasses; + import com.tngtech.archunit.junit.ArchTest; + import com.tngtech.archunit.lang.ArchRule; + import com.tngtech.archunit.library.Architectures; + +@AnalyzeClasses(packages = "mops.gruppen2", importOptions = { ImportOption.DoNotIncludeTests.class }) +public class LayeredArchitectureTest { + + private static Architectures.LayeredArchitecture layeredArchitecture = Architectures + .layeredArchitecture() + .layer("Domain").definedBy("..domain..") + .layer("Service").definedBy("..service") + .layer("Controller").definedBy("..controller..") + .layer("Repository").definedBy("..repository.."); + + @ArchTest + public static final ArchRule domainLayerShouldOnlyBeAccessedByServiceAndControllerLayer = layeredArchitecture + .whereLayer("Domain") + .mayOnlyBeAccessedByLayers("Service", "Controller"); + + @ArchTest + public static final ArchRule serviceLayerShouldOnlyBeAccessedByControllerLayer = layeredArchitecture + .whereLayer("Service") + .mayOnlyBeAccessedByLayers("Controller"); + + @ArchTest + public static final ArchRule repositoryLayerShouldOnlyBeAccessedByServiceLayer = layeredArchitecture + .whereLayer("Repository") + .mayOnlyBeAccessedByLayers("Service"); + + @ArchTest + public static final ArchRule controllerLayerShouldNotBeAccessedByAnyLayer = layeredArchitecture + .whereLayer("Controller") + .mayNotBeAccessedByAnyLayer(); + +}