Skip to content

Commit b8fc39e

Browse files
Automatically install Spring test dependencies into user project if required (#2197)
Spring testing dependencies auto-installation
1 parent b587f6c commit b8fc39e

File tree

10 files changed

+202
-42
lines changed

10 files changed

+202
-42
lines changed

utbot-framework-api/src/main/kotlin/org/utbot/framework/plugin/api/Api.kt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1341,6 +1341,32 @@ class SpringApplicationContext(
13411341
): Boolean = field.fieldId in classUnderTest.allDeclaredFieldIds && field.declaringClass.id !in springInjectedClasses
13421342
}
13431343

1344+
enum class SpringTestType(
1345+
override val id: String,
1346+
override val displayName: String,
1347+
override val description: String,
1348+
// Integration tests generation requires spring test framework being installed
1349+
var frameworkInstalled: Boolean = false,
1350+
) : CodeGenerationSettingItem {
1351+
UNIT_TESTS(
1352+
"Unit tests",
1353+
"Unit tests",
1354+
"Generate unit tests mocking other classes"
1355+
),
1356+
INTEGRATION_TESTS(
1357+
"Integration tests",
1358+
"Integration tests",
1359+
"Generate integration tests autowiring real instance"
1360+
);
1361+
1362+
override fun toString() = id
1363+
1364+
companion object : CodeGenerationSettingBox {
1365+
override val defaultItem = UNIT_TESTS
1366+
override val allItems: List<SpringTestType> = values().toList()
1367+
}
1368+
}
1369+
13441370
/**
13451371
* Describes information about beans obtained from Spring analysis process.
13461372
*

utbot-framework/src/main/kotlin/org/utbot/framework/plugin/api/utils/DependencyPatterns.kt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,21 @@ fun DependencyInjectionFramework.patterns(): Patterns {
7676
return Patterns(moduleLibraryPatterns, libraryPatterns)
7777
}
7878

79+
fun DependencyInjectionFramework.testPatterns(): Patterns {
80+
val moduleLibraryPatterns = when (this) {
81+
SpringBoot -> springBootTestModulePatterns
82+
SpringBeans -> springBeansTestModulePatterns
83+
else -> throw UnsupportedOperationException("Unknown dependency injection framework $this")
84+
}
85+
val libraryPatterns = when (this) {
86+
SpringBoot -> springBootTestPatterns
87+
SpringBeans -> springBeansTestPatterns
88+
else -> throw UnsupportedOperationException("Unknown dependency injection framework $this")
89+
}
90+
91+
return Patterns(moduleLibraryPatterns, libraryPatterns)
92+
}
93+
7994
val JUNIT_4_JAR_PATTERN = Regex("junit-4(\\.1[2-9])(\\.[0-9]+)?")
8095
val JUNIT_4_MVN_PATTERN = Regex("junit:junit:4(\\.1[2-9])(\\.[0-9]+)?")
8196
val junit4Patterns = listOf(JUNIT_4_JAR_PATTERN, JUNIT_4_MVN_PATTERN)
@@ -120,9 +135,24 @@ val springBeansPatterns = listOf(SPRING_BEANS_JAR_PATTERN, SPRING_BEANS_MVN_PATT
120135
val SPRING_BEANS_BASIC_MODULE_PATTERN = Regex("spring-beans")
121136
val springBeansModulePatterns = listOf(SPRING_BEANS_BASIC_MODULE_PATTERN)
122137

138+
val SPRING_BEANS_TEST_JAR_PATTERN = Regex("spring-test-([0-9]+)(\\.[0-9]+){1,2}")
139+
val SPRING_BEANS_TEST_MVN_PATTERN = Regex("org\\.springframework:spring-test:([0-9]+)(\\.[0-9]+){1,2}")
140+
val springBeansTestPatterns = listOf(SPRING_BEANS_TEST_JAR_PATTERN, SPRING_BEANS_TEST_MVN_PATTERN)
141+
142+
val SPRING_BEANS_TEST_BASIC_MODULE_PATTERN = Regex("spring-test")
143+
val springBeansTestModulePatterns = listOf(SPRING_BEANS_TEST_BASIC_MODULE_PATTERN)
144+
123145
val SPRING_BOOT_JAR_PATTERN = Regex("spring-boot-([0-9]+)(\\.[0-9]+){1,2}")
124146
val SPRING_BOOT_MVN_PATTERN = Regex("org\\.springframework\\.boot:spring-boot:([0-9]+)(\\.[0-9]+){1,2}")
125147
val springBootPatterns = listOf(SPRING_BOOT_JAR_PATTERN, SPRING_BOOT_MVN_PATTERN)
126148

127149
val SPRING_BOOT_BASIC_MODULE_PATTERN = Regex("spring-boot")
128150
val springBootModulePatterns = listOf(SPRING_BOOT_BASIC_MODULE_PATTERN)
151+
152+
val SPRING_BOOT_TEST_JAR_PATTERN = Regex("spring-boot-test-([0-9]+)(\\.[0-9]+){1,2}")
153+
val SPRING_BOOT_TEST_MVN_PATTERN = Regex("org\\.springframework\\.boot:spring-boot-test:([0-9]+)(\\.[0-9]+){1,2}")
154+
155+
val springBootTestPatterns = listOf(SPRING_BOOT_TEST_JAR_PATTERN, SPRING_BOOT_TEST_MVN_PATTERN)
156+
157+
val SPRING_BOOT_TEST_BASIC_MODULE_PATTERN = Regex("spring-boot-test")
158+
val springBootTestModulePatterns = listOf(SPRING_BOOT_TEST_BASIC_MODULE_PATTERN)

utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/generator/UtTestsDialogProcessor.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ import kotlin.io.path.exists
4040
import kotlin.io.path.pathString
4141
import mu.KotlinLogging
4242
import org.jetbrains.concurrency.Promise
43+
import org.jetbrains.concurrency.all
44+
import org.jetbrains.concurrency.thenRun
4345
import org.jetbrains.idea.maven.project.MavenProjectsManager
4446
import org.jetbrains.kotlin.idea.base.util.module
4547
import org.utbot.framework.CancellationStrategyType.CANCEL_EVERYTHING
@@ -181,8 +183,11 @@ object UtTestsDialogProcessor {
181183
.map { it.containingFile.virtualFile }
182184
.toTypedArray()
183185

184-
val promise = compile(project, filesToCompile, springConfigClass)
185-
promise.onSuccess {
186+
val compilationPromise = model.preCompilePromises
187+
.all()
188+
.thenAsync { compile(project, filesToCompile, springConfigClass) }
189+
190+
compilationPromise.onSuccess {
186191
if (it.hasErrors() || it.isAborted)
187192
return@onSuccess
188193

utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/models/ExternalLibraryDescriptors.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ fun jUnit5ParametrizedTestsLibraryDescriptor(versionInProject: String?) =
2222
fun mockitoCoreLibraryDescriptor(versionInProject: String?) =
2323
ExternalLibraryDescriptor("org.mockito", "mockito-core", "3.5.0", null, versionInProject ?: "4.2.0")
2424

25+
fun springBootTestLibraryDescriptor(versionInProject: String?) =
26+
ExternalLibraryDescriptor("org.springframework.boot", "spring-boot-test", "2.4.0", null, versionInProject ?: "3.0.6")
27+
28+
fun springTestLibraryDescriptor(versionInProject: String?) =
29+
ExternalLibraryDescriptor("org.springframework", "spring-test", "2.5", null, versionInProject ?: "6.0.8")
30+
31+
2532
/**
2633
* TestNg requires JDK 11 since version 7.6.0
2734
* For projects with JDK 8 version 7.5 should be installed.

utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/models/GenerateTestsModel.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@ import com.intellij.openapi.project.Project
1515
import com.intellij.psi.PsiClass
1616
import com.intellij.psi.PsiJavaFile
1717
import com.intellij.refactoring.util.classMembers.MemberInfo
18+
import org.jetbrains.concurrency.Promise
1819
import org.jetbrains.kotlin.psi.KtFile
1920
import org.utbot.framework.SummariesGenerationType
2021
import org.utbot.framework.UtSettings
2122
import org.utbot.framework.codegen.domain.TypeReplacementApproach
2223
import org.utbot.framework.plugin.api.JavaDocCommentStyle
24+
import org.utbot.framework.plugin.api.SpringTestType
2325
import org.utbot.framework.util.ConflictTriggers
2426
import org.utbot.intellij.plugin.settings.Settings
2527

@@ -52,12 +54,14 @@ class GenerateTestsModel(
5254
var runInspectionAfterTestGeneration: Boolean = true
5355
lateinit var forceStaticMocking: ForceStaticMocking
5456
lateinit var chosenClassesToMockAlways: Set<ClassId>
57+
lateinit var springTestType: SpringTestType
5558
lateinit var commentStyle: JavaDocCommentStyle
5659

5760
lateinit var typeReplacementApproach: TypeReplacementApproach
5861
lateinit var profileNames: String
5962

6063
val conflictTriggers: ConflictTriggers = ConflictTriggers()
64+
val preCompilePromises: MutableList<Promise<*>> = mutableListOf()
6165

6266
var runGeneratedTestsWithCoverage : Boolean = false
6367
var summariesGenerationType : SummariesGenerationType = UtSettings.summaryGenerationType

utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/settings/Settings.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ private fun fromGenerateTestsModel(model: GenerateTestsModel): Settings.State {
2323
forceStaticMocking = model.forceStaticMocking,
2424
parametrizedTestSource = model.parametrizedTestSource,
2525
classesToMockAlways = model.chosenClassesToMockAlways.mapTo(mutableSetOf()) { it.name }.toTypedArray(),
26+
springTestType = model.springTestType,
2627
fuzzingValue = model.fuzzingValue,
2728
runGeneratedTestsWithCoverage = model.runGeneratedTestsWithCoverage,
2829
commentStyle = model.commentStyle,

0 commit comments

Comments
 (0)