From 1593ed1ba9717a917f5f38170d5e111cca770a3b Mon Sep 17 00:00:00 2001 From: John Burns Date: Mon, 19 Jan 2026 15:53:25 -0600 Subject: [PATCH] add haveAnyDependenciesThat condition to ArchConditions Signed-off-by: John Burns --- .../lang/conditions/ArchConditions.java | 8 +++++ .../lang/conditions/ArchConditionsTest.java | 34 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/archunit/src/main/java/com/tngtech/archunit/lang/conditions/ArchConditions.java b/archunit/src/main/java/com/tngtech/archunit/lang/conditions/ArchConditions.java index 690af2ed95..2513816677 100644 --- a/archunit/src/main/java/com/tngtech/archunit/lang/conditions/ArchConditions.java +++ b/archunit/src/main/java/com/tngtech/archunit/lang/conditions/ArchConditions.java @@ -314,6 +314,14 @@ public static ArchCondition dependOnClassesThat(DescribedPredicate haveAnyDependenciesThat(DescribedPredicate predicate) { + return new AnyDependencyCondition( + "have any dependencies that " + predicate.getDescription(), + predicate, + GET_DIRECT_DEPENDENCIES_FROM_SELF); + } + @PublicAPI(usage = ACCESS) public static ArchCondition transitivelyDependOnClassesThat(DescribedPredicate predicate) { return new TransitiveDependencyCondition(predicate); diff --git a/archunit/src/test/java/com/tngtech/archunit/lang/conditions/ArchConditionsTest.java b/archunit/src/test/java/com/tngtech/archunit/lang/conditions/ArchConditionsTest.java index 145eda2cb3..f5f92ee5c9 100644 --- a/archunit/src/test/java/com/tngtech/archunit/lang/conditions/ArchConditionsTest.java +++ b/archunit/src/test/java/com/tngtech/archunit/lang/conditions/ArchConditionsTest.java @@ -36,7 +36,9 @@ import static com.tngtech.archunit.lang.conditions.ArchConditions.containAnyElementThat; import static com.tngtech.archunit.lang.conditions.ArchConditions.containOnlyElementsThat; import static com.tngtech.archunit.lang.conditions.ArchConditions.declareThrowableOfType; +import static com.tngtech.archunit.lang.conditions.ArchConditions.dependOnClassesThat; import static com.tngtech.archunit.lang.conditions.ArchConditions.have; +import static com.tngtech.archunit.lang.conditions.ArchConditions.haveAnyDependenciesThat; import static com.tngtech.archunit.lang.conditions.ArchConditions.never; import static com.tngtech.archunit.lang.conditions.ArchConditions.not; import static com.tngtech.archunit.lang.conditions.ArchConditions.onlyBeAccessedByAnyPackage; @@ -164,6 +166,38 @@ public void only_have_dependents_where() { .containNoViolation(); } + @Test + public void depend_on_classes_that() { + JavaClasses classes = importClasses(CallingClass.class, SomeClass.class); + JavaClass callingClass = classes.get(CallingClass.class); + + assertThat(dependOnClassesThat(alwaysFalse())) + .checking(callingClass) + .haveAtLeastOneViolationMessageMatching(String.format(".*%s.*%s.*", + quote(CallingClass.class.getName()), quote(SomeClass.class.getName()))); + + assertThat(dependOnClassesThat(DescribedPredicate.alwaysTrue().as("custom"))) + .hasDescription("depend on classes that custom") + .checking(callingClass) + .containNoViolation(); + } + + @Test + public void have_any_dependencies_that() { + JavaClasses classes = importClasses(CallingClass.class, SomeClass.class); + JavaClass callingClass = classes.get(CallingClass.class); + + assertThat(haveAnyDependenciesThat(alwaysFalse())) + .checking(callingClass) + .haveAtLeastOneViolationMessageMatching(String.format(".*%s.*%s.*", + quote(CallingClass.class.getName()), quote(SomeClass.class.getName()))); + + assertThat(haveAnyDependenciesThat(DescribedPredicate.alwaysTrue().as("custom"))) + .hasDescription("have dependencies that custom") + .checking(callingClass) + .containNoViolation(); + } + @Test public void declare_throwable_of_type() { class Failure {