Skip to content

Commit b67debe

Browse files
Remove unnecessary annotations from Spring integration tests (#2442)
1 parent 051b293 commit b67debe

File tree

6 files changed

+68
-52
lines changed

6 files changed

+68
-52
lines changed

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1320,7 +1320,12 @@ enum class TypeReplacementMode {
13201320
}
13211321

13221322
sealed class SpringConfiguration(val fullDisplayName: String) {
1323-
class JavaConfiguration(val classBinaryName: String) : SpringConfiguration(classBinaryName)
1323+
abstract class JavaBasedConfiguration(open val configBinaryName: String) : SpringConfiguration(configBinaryName)
1324+
1325+
class JavaConfiguration(override val configBinaryName: String) : JavaBasedConfiguration(configBinaryName)
1326+
1327+
class SpringBootConfiguration(override val configBinaryName: String, val isUnique: Boolean): JavaBasedConfiguration(configBinaryName)
1328+
13241329
class XMLConfiguration(val absolutePath: String) : SpringConfiguration(absolutePath)
13251330
}
13261331

utbot-framework/src/main/kotlin/org/utbot/framework/codegen/tree/CgSpringIntegrationTestClassConstructor.kt

Lines changed: 46 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -103,18 +103,26 @@ class CgSpringIntegrationTestClassConstructor(
103103
)
104104

105105
private fun addNecessarySpringSpecificAnnotations() {
106+
val isSpringBootTestAccessible = utContext.classLoader.tryLoadClass(springBootTestClassId.name) != null
107+
if (isSpringBootTestAccessible) {
108+
addAnnotation(springBootTestClassId, Class)
109+
}
110+
106111
val (testFrameworkExtension, springExtension) = when (testFramework) {
107112
Junit4 -> runWithClassId to springRunnerClassId
108113
Junit5 -> extendWithClassId to springExtensionClassId
109114
TestNg -> error("Spring extension is not implemented in TestNg")
110115
else -> error("Trying to generate tests for Spring project with non-JVM framework")
111116
}
112117

113-
addAnnotation(
114-
classId = testFrameworkExtension,
115-
argument = createGetClassExpression(springExtension, codegenLanguage),
116-
target = Class,
117-
)
118+
// @SpringBootTest contains @ExtendWith(SpringExtension.class), no need to add it manually
119+
if (!isSpringBootTestAccessible || testFrameworkExtension != extendWithClassId) {
120+
addAnnotation(
121+
classId = testFrameworkExtension,
122+
argument = createGetClassExpression(springExtension, codegenLanguage),
123+
target = Class,
124+
)
125+
}
118126

119127
if (utContext.classLoader.tryLoadClass(springBootTestContextBootstrapperClassId.name) != null)
120128
// TODO in somewhat new versions of Spring Boot, @SpringBootTest
@@ -126,49 +134,44 @@ class CgSpringIntegrationTestClassConstructor(
126134
target = Class,
127135
)
128136

129-
if (utContext.classLoader.tryLoadClass(springBootTestClassId.name) != null)
130-
addAnnotation(springBootTestClassId, Class)
131-
132-
// TODO avoid adding @ActiveProfiles(profiles = {"default"}) to reduce number of annotations
133-
addAnnotation(
134-
classId = activeProfilesClassId,
135-
namedArguments =
136-
listOf(
137-
CgNamedAnnotationArgument(
138-
name = "profiles",
139-
value =
140-
CgArrayAnnotationArgument(
141-
springSettings.profiles.map { profile ->
142-
profile.resolve()
143-
}
137+
val defaultProfileIsUsed = springSettings.profiles.singleOrNull() == "default"
138+
if (!defaultProfileIsUsed) {
139+
addAnnotation(
140+
classId = activeProfilesClassId,
141+
namedArguments = listOf(
142+
CgNamedAnnotationArgument(
143+
name = "profiles",
144+
value = CgArrayAnnotationArgument(springSettings.profiles.map { profile -> profile.resolve() })
144145
)
145-
)
146-
),
147-
target = Class,
148-
)
146+
),
147+
target = Class,
148+
)
149+
}
149150

150-
// TODO avoid adding @ContextConfiguration(classes = {$defaultBootConfigClass}) to reduce number of annotations
151-
addAnnotation(
152-
classId = contextConfigurationClassId,
153-
namedArguments =
154-
listOf(
155-
CgNamedAnnotationArgument(
156-
name = "classes",
157-
value = CgArrayAnnotationArgument(
158-
listOf(
159-
createGetClassExpression(
160-
// TODO:
161-
// For now we support only JavaConfigurations in integration tests.
162-
// Adapt for XMLConfigurations when supported.
163-
ClassId((springSettings.configuration as JavaConfiguration).classBinaryName),
164-
codegenLanguage
151+
val configClass = springSettings.configuration as JavaBasedConfiguration
152+
if (configClass is JavaConfiguration || configClass is SpringBootConfiguration && !configClass.isUnique) {
153+
addAnnotation(
154+
classId = contextConfigurationClassId,
155+
namedArguments = listOf(
156+
CgNamedAnnotationArgument(
157+
name = "classes",
158+
value = CgArrayAnnotationArgument(
159+
listOf(
160+
createGetClassExpression(
161+
// TODO: we support only JavaConfigurations in integration tests.
162+
// Adapt for XMLConfigurations when supported.
163+
ClassId((springSettings.configuration as JavaConfiguration).configBinaryName),
164+
codegenLanguage
165+
)
165166
)
166167
)
167168
)
168-
)
169-
),
170-
target = Class,
171-
)
169+
),
170+
target = Class,
171+
)
172+
}
173+
174+
172175
addAnnotation(
173176
classId = dirtiesContextClassId,
174177
namedArguments = listOf(

utbot-instrumentation/src/main/kotlin/org/utbot/instrumentation/instrumentation/spring/SpringInstrumentationContext.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class SpringInstrumentationContext(
2626
// so we expect JavaConfigurations only.
2727
// After fix rewrite the following.
2828
classLoader.loadClass(
29-
(springSettings.configuration as? JavaConfiguration)?.classBinaryName
29+
(springSettings.configuration as? JavaBasedConfiguration)?.configBinaryName
3030
?: error("JavaConfiguration was expected, but ${springSettings.configuration.javaClass.name} was provided.")
3131
)
3232
),

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -180,10 +180,10 @@ object UtTestsDialogProcessor {
180180
is AbsentSpringSettings -> null
181181
is PresentSpringSettings ->
182182
when (val config = settings.configuration) {
183-
is JavaConfiguration -> {
183+
is JavaBasedConfiguration -> {
184184
PsiClassHelper
185-
.findClass(config.classBinaryName, project)
186-
?: error("Cannot find configuration class ${config.classBinaryName}.")
185+
.findClass(config.configBinaryName, project)
186+
?: error("Cannot find configuration class ${config.configBinaryName}.")
187187
}
188188
// TODO: for XML config we also need to compile module containing,
189189
// since it may reference classes from that module

utbot-intellij/src/main/kotlin/org/utbot/intellij/plugin/ui/GenerateTestsDialogWindow.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -707,7 +707,16 @@ class GenerateTestsDialogWindow(val model: GenerateTestsModel) : DialogWrapper(m
707707
SpringConfiguration.XMLConfiguration(absolutePath)
708708
} else {
709709
val classBinaryName = javaConfigurationHelper.restoreFullName(shortConfigName)
710-
SpringConfiguration.JavaConfiguration(classBinaryName)
710+
711+
val springBootConfigs = model.getSortedSpringBootApplicationClasses()
712+
if (springBootConfigs.contains(classBinaryName)) {
713+
SpringConfiguration.SpringBootConfiguration(
714+
configBinaryName = classBinaryName,
715+
isUnique = springBootConfigs.size == 1,
716+
)
717+
} else {
718+
SpringConfiguration.JavaConfiguration(classBinaryName)
719+
}
711720
}
712721

713722
PresentSpringSettings(

utbot-spring-analyzer/src/main/kotlin/org/utbot/spring/utils/SourceFinder.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import org.utbot.common.patchAnnotation
77
import org.utbot.framework.plugin.api.SpringConfiguration.*
88
import org.utbot.spring.api.ApplicationData
99
import org.utbot.spring.config.TestApplicationConfiguration
10-
import org.utbot.spring.configurators.ApplicationConfigurationType
1110
import java.nio.file.Path
1211
import kotlin.io.path.Path
1312

@@ -20,11 +19,11 @@ class SourceFinder(
2019

2120
fun findSources(): Array<Class<*>> =
2221
when (val config = applicationData.springSettings.configuration) {
23-
is JavaConfiguration -> {
22+
is JavaBasedConfiguration -> {
2423
logger.info { "Using java Spring configuration" }
2524
arrayOf(
2625
TestApplicationConfiguration::class.java,
27-
classLoader.loadClass(config.classBinaryName)
26+
classLoader.loadClass(config.configBinaryName)
2827
)
2928
}
3029

0 commit comments

Comments
 (0)