diff --git a/archunit/src/main/java/com/tngtech/archunit/library/modules/ModuleDependency.java b/archunit/src/main/java/com/tngtech/archunit/library/modules/ModuleDependency.java index 5a3743ffdf..98fa23c958 100644 --- a/archunit/src/main/java/com/tngtech/archunit/library/modules/ModuleDependency.java +++ b/archunit/src/main/java/com/tngtech/archunit/library/modules/ModuleDependency.java @@ -84,6 +84,7 @@ public Set toClassDependencies() { @PublicAPI(usage = ACCESS, state = EXPERIMENTAL) public String getDescription() { String classDependencyDescriptions = classDependencies.stream() + .sorted() .map(HasDescription::getDescription) .collect(joining(lineSeparator())); return String.format("Module Dependency [%s -> %s]:%n%s", origin.getName(), target.getName(), classDependencyDescriptions); diff --git a/archunit/src/test/java/com/tngtech/archunit/library/modules/ModuleDependencyTest.java b/archunit/src/test/java/com/tngtech/archunit/library/modules/ModuleDependencyTest.java index 69d14ffbc8..9ff1da6330 100644 --- a/archunit/src/test/java/com/tngtech/archunit/library/modules/ModuleDependencyTest.java +++ b/archunit/src/test/java/com/tngtech/archunit/library/modules/ModuleDependencyTest.java @@ -3,10 +3,14 @@ import com.tngtech.archunit.core.domain.Dependency; import com.tngtech.archunit.core.importer.ClassFileImporter; import com.tngtech.archunit.library.modules.syntax.testexamples.test_modules.one.ClassOne; +import com.tngtech.archunit.library.modules.syntax.testexamples.test_modules.one.one.ClassOneOne; import com.tngtech.archunit.library.modules.syntax.testexamples.test_modules.two.ClassTwo; +import com.tngtech.archunit.library.modules.syntax.testexamples.test_modules.two.one.ClassTwoOne; import org.junit.Test; import static com.tngtech.archunit.testutil.Assertions.assertThatConversionOf; +import static java.lang.System.lineSeparator; +import static org.assertj.core.api.Assertions.assertThat; public class ModuleDependencyTest { @Test @@ -21,10 +25,26 @@ public void can_be_converted_to_dependencies() { .isPossibleTo(Dependency.class); } + @Test + public void description_contains_class_dependencies_in_stable_order() { + ArchModules modules = ArchModules.defineByPackages("..test_modules.(*)..") + .modularize(new ClassFileImporter().importPackagesOf( + ClassOne.class, ClassOneOne.class, ClassTwo.class, ClassTwoOne.class)); + + ModuleDependency moduleDependency = createDependency(modules, "one", "two"); + + assertThat(moduleDependency.getDescription()) + .isEqualTo(String.format("Module Dependency [one -> two]:%n%s%n%s", + String.format("Field <%s.classTwo> has type <%s> in (ClassOne.java:0)", + ClassOne.class.getName(), ClassTwo.class.getName()), + String.format("Field <%s.twoOne> has type <%s> in (ClassOneOne.java:0)", + ClassOneOne.class.getName(), ClassTwoOne.class.getName()))); + } + private static ModuleDependency createDependency(ArchModules modules, String originIdentifier, String targetIdentifier) { return ModuleDependency.tryCreate( modules.getByIdentifier(originIdentifier), modules.getByIdentifier(targetIdentifier) ).get(); } -} \ No newline at end of file +}