diff --git a/utbot-framework/build.gradle b/utbot-framework/build.gradle index cc7235618c..3b4e7b3a9e 100644 --- a/utbot-framework/build.gradle +++ b/utbot-framework/build.gradle @@ -4,6 +4,7 @@ plugins { configurations { fetchSpringAnalyzerJar + fetchSpringCommonsJar fetchInstrumentationJar } @@ -51,6 +52,7 @@ dependencies { implementation project(':utbot-spring-commons-api') implementation project(':utbot-spring-analyzer') fetchSpringAnalyzerJar project(path: ':utbot-spring-analyzer', configuration: 'springAnalyzerJar') + fetchSpringCommonsJar project(path: ':utbot-spring-commons', configuration: 'springCommonsJar') } processResources { @@ -61,4 +63,8 @@ processResources { from(configurations.fetchSpringAnalyzerJar) { into "lib" } + + from(configurations.fetchSpringCommonsJar) { + into "lib" + } } diff --git a/utbot-instrumentation/src/main/kotlin/org/utbot/instrumentation/instrumentation/spring/SpringUtExecutionInstrumentation.kt b/utbot-instrumentation/src/main/kotlin/org/utbot/instrumentation/instrumentation/spring/SpringUtExecutionInstrumentation.kt index 1f8b9893d5..8540edd957 100644 --- a/utbot-instrumentation/src/main/kotlin/org/utbot/instrumentation/instrumentation/spring/SpringUtExecutionInstrumentation.kt +++ b/utbot-instrumentation/src/main/kotlin/org/utbot/instrumentation/instrumentation/spring/SpringUtExecutionInstrumentation.kt @@ -22,6 +22,7 @@ import org.utbot.instrumentation.instrumentation.execution.context.Instrumentati import org.utbot.instrumentation.instrumentation.execution.phases.ExecutionPhaseFailingOnAnyException import org.utbot.instrumentation.instrumentation.execution.phases.PhasesController import org.utbot.spring.api.SpringApi +import java.io.File import java.net.URL import java.net.URLClassLoader import java.security.ProtectionDomain @@ -50,6 +51,14 @@ class SpringUtExecutionInstrumentation( companion object { private val logger = getLogger() private const val SPRING_COMMONS_JAR_FILENAME = "utbot-spring-commons-shadow.jar" + + val springCommonsJar: File by lazy { + JarUtils.extractJarFileFromResources( + jarFileName = SPRING_COMMONS_JAR_FILENAME, + jarResourcePath = "lib/$SPRING_COMMONS_JAR_FILENAME", + targetDirectoryName = "spring-commons" + ) + } } fun tryLoadingSpringContext(): ConcreteContextLoadingResult { @@ -147,11 +156,7 @@ class SpringUtExecutionInstrumentation( private val buildDirs: Array, ) : UtExecutionInstrumentation.Factory { override val additionalRuntimeClasspath: Set - get() = super.additionalRuntimeClasspath + JarUtils.extractJarFileFromResources( - jarFileName = SPRING_COMMONS_JAR_FILENAME, - jarResourcePath = "lib/$SPRING_COMMONS_JAR_FILENAME", - targetDirectoryName = "spring-commons" - ).path + get() = super.additionalRuntimeClasspath + springCommonsJar.path // TODO may be we can use some alternative sandbox that has more permissions // (at the very least we need `ReflectPermission("suppressAccessChecks")` diff --git a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/generator/UtTestsDialogProcessor.kt b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/generator/UtTestsDialogProcessor.kt index ffd59fe240..b844ea7cf4 100644 --- a/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/generator/UtTestsDialogProcessor.kt +++ b/utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/generator/UtTestsDialogProcessor.kt @@ -59,6 +59,7 @@ import org.utbot.framework.plugin.api.util.LockFile import org.utbot.framework.plugin.api.util.withStaticsSubstitutionRequired import org.utbot.framework.plugin.services.JdkInfoService import org.utbot.framework.plugin.services.WorkingDirService +import org.utbot.instrumentation.instrumentation.spring.SpringUtExecutionInstrumentation import org.utbot.intellij.plugin.generator.CodeGenerationController.generateTests import org.utbot.intellij.plugin.models.GenerateTestsModel import org.utbot.intellij.plugin.process.EngineProcess @@ -261,7 +262,11 @@ object UtTestsDialogProcessor { val process = EngineProcess.createBlocking(project, classNameToPath) process.terminateOnException { _ -> - val classpathForClassLoader = buildDirs + classpathList + val classpathForClassLoader = buildDirs + classpathList + when (model.projectType) { + Spring -> listOf(SpringUtExecutionInstrumentation.springCommonsJar.path) + else -> emptyList() + } + process.setupUtContext(classpathForClassLoader) val simpleApplicationContext = SimpleApplicationContext( SimpleMockerContext(mockFrameworkInstalled, staticMockingConfigured) diff --git a/utbot-spring-commons/build.gradle.kts b/utbot-spring-commons/build.gradle.kts index 3c548392aa..da6f100f1d 100644 --- a/utbot-spring-commons/build.gradle.kts +++ b/utbot-spring-commons/build.gradle.kts @@ -19,9 +19,16 @@ java { dependencies { implementation(project(":utbot-spring-commons-api")) - implementation(project(":utbot-core")) - // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot + + // these dependencies are compilieOnly, because they should + // already be present on the classpath in all utbot processes + compileOnly(project(":utbot-core")) + compileOnly("com.jetbrains.rd:rd-core:$rdVersion") { exclude(group = "org.slf4j", module = "slf4j-api") } + + + // these dependencies are compilieOnly, because they should + // be picked up from user classpath if they are present there compileOnly("org.springframework.boot:spring-boot:$springBootVersion") compileOnly("org.springframework.boot:spring-boot-test-autoconfigure:$springBootVersion") compileOnly("org.springframework:spring-test:$springVersion") @@ -32,8 +39,6 @@ dependencies { compileOnly("javax.persistence:javax.persistence-api:$javaxVersion") compileOnly("jakarta.persistence:jakarta.persistence-api:$jakartaVersion") - - implementation("com.jetbrains.rd:rd-core:$rdVersion") { exclude(group = "org.slf4j", module = "slf4j-api") } } tasks.shadowJar {