From 94e637a11eb4bc741c34b5f3741c3a369b6559c7 Mon Sep 17 00:00:00 2001 From: Marco Collovati Date: Wed, 25 Mar 2026 16:29:28 +0100 Subject: [PATCH] fix: use scan classloader to load application classes Currently, discovered route classes are loaded using Class.forName, with fallback using Thread context classloder. This does not work properly with the combo Gradle + Quarkus + multi module project, because application classes from modules different from the one who owns the test are loaded both in AppClassLoder and Quarkus Classloader. To be noted that running quarkusTest task instead of test task does not cause any problem. This change uses the scan classloader to load the application classes to prevent ClassCastExceptions. Related to vaadin/browserless-test#17 --- .../main/kotlin/com/vaadin/testbench/unit/internal/Routes.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/vaadin-testbench-unit-shared/src/main/kotlin/com/vaadin/testbench/unit/internal/Routes.kt b/vaadin-testbench-unit-shared/src/main/kotlin/com/vaadin/testbench/unit/internal/Routes.kt index 27f590a4a..443fef90c 100644 --- a/vaadin-testbench-unit-shared/src/main/kotlin/com/vaadin/testbench/unit/internal/Routes.kt +++ b/vaadin-testbench-unit-shared/src/main/kotlin/com/vaadin/testbench/unit/internal/Routes.kt @@ -78,12 +78,13 @@ data class Routes( val classGraph: ClassGraph = ClassGraph().enableClassInfo() .enableAnnotationInfo() .acceptPackages(*(packageNames.map { it ?: "" }.toTypedArray())) + classGraph.scan().use { scanResult: ScanResult -> scanResult.getClassesWithAnnotation(Route::class.java.name).mapTo(routes) { info: ClassInfo -> - findClassOrThrow(info.name).asSubclass(Component::class.java) + scanResult.loadClass(info.name, Component::class.java, false) } scanResult.getClassesImplementing(HasErrorParameter::class.java.name).mapTo(errorRoutes) { info: ClassInfo -> - findClassOrThrow(info.name).asSubclass(HasErrorParameter::class.java) + scanResult.loadClass(info.name, HasErrorParameter::class.java, false) } }