From 8bd6d20f69d1b83dfabb1353d977b72959024777 Mon Sep 17 00:00:00 2001 From: redcatbaer Date: Sat, 11 Jul 2026 09:57:22 +0200 Subject: [PATCH 1/4] 536: Set.copyOf() is idempotent for unmodifiable sets. --- .../itsallcode/openfasttrace/api/FilterSettings.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/api/src/main/java/org/itsallcode/openfasttrace/api/FilterSettings.java b/api/src/main/java/org/itsallcode/openfasttrace/api/FilterSettings.java index a79d1eda9..7b5019286 100644 --- a/api/src/main/java/org/itsallcode/openfasttrace/api/FilterSettings.java +++ b/api/src/main/java/org/itsallcode/openfasttrace/api/FilterSettings.java @@ -1,6 +1,5 @@ package org.itsallcode.openfasttrace.api; -import java.util.Collections; import java.util.Objects; import java.util.Set; @@ -27,7 +26,7 @@ private FilterSettings(final Builder builder) */ public Set getArtifactTypes() { - return this.artifactTypes; + return Set.copyOf(this.artifactTypes); } /** @@ -38,7 +37,7 @@ public Set getArtifactTypes() public Set getTags() { - return this.tags; + return Set.copyOf(this.tags); } /** @@ -122,8 +121,8 @@ public static Builder builder() */ public static final class Builder { - private Set artifactTypes = Collections.emptySet(); - private Set tags = Collections.emptySet(); + private Set artifactTypes = Set.of(); + private Set tags = Set.of(); private boolean withoutTags = true; private Builder() @@ -158,7 +157,7 @@ public Builder tags(final Set tags) } /** - * Configure if filter allows items that have no tags. + * Configure if the filter allows items that have no tags. * * @param noTags * {@code true} to match items without any tags From 309697218bcd6ef0ecdcbab48add0e758606c52f Mon Sep 17 00:00:00 2001 From: redcatbaer Date: Sat, 11 Jul 2026 10:05:13 +0200 Subject: [PATCH 2/4] 536: Improved mocking and readability of ImporterFactoryLoaderClassloaderIT. --- .../ImporterFactoryLoaderClassloaderIT.java | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/core/src/test/java/org/itsallcode/openfasttrace/core/importer/ImporterFactoryLoaderClassloaderIT.java b/core/src/test/java/org/itsallcode/openfasttrace/core/importer/ImporterFactoryLoaderClassloaderIT.java index 03328b021..0f2e252cd 100644 --- a/core/src/test/java/org/itsallcode/openfasttrace/core/importer/ImporterFactoryLoaderClassloaderIT.java +++ b/core/src/test/java/org/itsallcode/openfasttrace/core/importer/ImporterFactoryLoaderClassloaderIT.java @@ -11,39 +11,40 @@ import org.itsallcode.openfasttrace.api.importer.input.InputFile; import org.itsallcode.openfasttrace.api.importer.input.RealFileInput; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; /** * Test to reproduce the classloader mismatch problem when discovering * importers. *

- * This scenario will happen if OFT is used as a library with a custom classloader. - * What we want in that case is a very clear exception message because without - * an importer, neither tracing nor converting have any chance to work. + * This scenario will happen if OFT is used as a library with a custom + * classloader. What we want in that case is a very clear exception message + * because without an importer, neither tracing nor converting does have any + * chance to work. *

*/ +@ExtendWith(MockitoExtension.class) class ImporterFactoryLoaderClassloaderIT { /** - * This test demonstrates that if the Thread Context ClassLoader (TCCL) - * does not have access to the importer factories, {@link ImporterFactoryLoader} + * This test demonstrates that if the Thread Context ClassLoader (TCCL) does + * not have access to the importer factories, {@link ImporterFactoryLoader} * will fail to find any importers and should throw an exception. */ @Test - final void testGetImporterFactoryThrowsExceptionWhenTcclIsLimited() + final void testGetImporterFactoryThrowsExceptionWhenTcclIsLimited(@Mock final ImporterContext context) { final ClassLoader originalTccl = Thread.currentThread().getContextClassLoader(); final ClassLoader limitedClassLoader = new NoOpClassLoader(); - try { Thread.currentThread().setContextClassLoader(limitedClassLoader); - final ImporterContext context = Mockito.mock(ImporterContext.class); final ImporterFactoryLoader loaderWithLimitedTccl = new ImporterFactoryLoader(context); final InputFile file = RealFileInput.forPath(Paths.get("test.md")); - final ImporterException exception = assertThrows(ImporterException.class, () -> - loaderWithLimitedTccl.getImporterFactory(file) - ); + final ImporterException exception = assertThrows(ImporterException.class, + () -> loaderWithLimitedTccl.getImporterFactory(file)); assertThat(exception.getMessage().contains("No importers discovered"), is(true)); } finally From bb37462b1751cf9e9079ec5f5b7ec37becadc35e Mon Sep 17 00:00:00 2001 From: redcatbaer Date: Sat, 11 Jul 2026 10:14:16 +0200 Subject: [PATCH 3/4] 536: Replaced Collectors.toList() with Stream.toList() using explicit type definition in SpecificationItemIdMatcher. --- .../core/matcher/SpecificationItemIdMatcher.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/src/test/java/org/itsallcode/openfasttrace/core/matcher/SpecificationItemIdMatcher.java b/core/src/test/java/org/itsallcode/openfasttrace/core/matcher/SpecificationItemIdMatcher.java index e3e9fbf8f..5be8ccb84 100644 --- a/core/src/test/java/org/itsallcode/openfasttrace/core/matcher/SpecificationItemIdMatcher.java +++ b/core/src/test/java/org/itsallcode/openfasttrace/core/matcher/SpecificationItemIdMatcher.java @@ -2,7 +2,6 @@ import java.util.Collection; import java.util.List; -import java.util.stream.Collectors; import org.hamcrest.Matcher; import org.hamcrest.collection.IsEmptyIterable; @@ -54,8 +53,8 @@ public static Matcher> equalIds( return IsEmptyIterable.emptyIterable(); } final List> matchers = expected.stream() - .map(SpecificationItemIdMatcher::equalTo) - .collect(Collectors.toList()); + .>map(SpecificationItemIdMatcher::equalTo) + .toList(); return IsIterableContainingInAnyOrder.containsInAnyOrder(matchers); } } From b681ccb09e3b850276e5f47a258c3a238fc20159 Mon Sep 17 00:00:00 2001 From: redcatbaer Date: Sat, 11 Jul 2026 10:15:46 +0200 Subject: [PATCH 4/4] 536: Used static import in for mock() in TestAbstractImporterFactory. --- .../api/importer/TestAbstractImporterFactory.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/src/test/java/org/itsallcode/openfasttrace/api/importer/TestAbstractImporterFactory.java b/api/src/test/java/org/itsallcode/openfasttrace/api/importer/TestAbstractImporterFactory.java index cb469c01e..df2fa266b 100644 --- a/api/src/test/java/org/itsallcode/openfasttrace/api/importer/TestAbstractImporterFactory.java +++ b/api/src/test/java/org/itsallcode/openfasttrace/api/importer/TestAbstractImporterFactory.java @@ -3,11 +3,11 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.sameInstance; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.mock; import org.itsallcode.openfasttrace.api.importer.input.InputFile; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; /** * Unit test for {@link AbstractImporterFactory}. @@ -20,7 +20,7 @@ class TestAbstractImporterFactory @BeforeEach void setUp() { - context = Mockito.mock(ImporterContext.class); + context = mock(ImporterContext.class); importerFactory = new TestingImporterFactory(); }