@@ -8,8 +8,9 @@ import org.utbot.analytics.EngineAnalyticsContext
88import org.utbot.analytics.FeatureProcessor
99import org.utbot.analytics.Predictors
1010import org.utbot.api.exception.UtMockAssumptionViolatedException
11- import org.utbot.common.measureTime
1211import org.utbot.common.debug
12+ import org.utbot.common.measureTime
13+ import org.utbot.common.tryLoadClass
1314import org.utbot.engine.MockStrategy.NO_MOCKS
1415import org.utbot.engine.pc.*
1516import org.utbot.engine.selectors.*
@@ -32,17 +33,17 @@ import org.utbot.framework.UtSettings.pathSelectorStepsLimit
3233import org.utbot.framework.UtSettings.pathSelectorType
3334import org.utbot.framework.UtSettings.processUnknownStatesDuringConcreteExecution
3435import org.utbot.framework.UtSettings.useDebugVisualization
35- import org.utbot.framework.util.convertToAssemble
3636import org.utbot.framework.plugin.api.*
3737import org.utbot.framework.plugin.api.Step
3838import org.utbot.framework.plugin.api.util.*
39+ import org.utbot.framework.util.convertToAssemble
3940import org.utbot.framework.util.graph
4041import org.utbot.framework.util.sootMethod
4142import org.utbot.fuzzer.*
4243import org.utbot.fuzzing.*
43- import org.utbot.fuzzing.providers.ObjectValueProvider
4444import org.utbot.fuzzing.providers.FieldValueProvider
45- import org.utbot.fuzzing.spring.SavedEntityProvider
45+ import org.utbot.fuzzing.providers.ObjectValueProvider
46+ import org.utbot.fuzzing.spring.SavedEntityValueProvider
4647import org.utbot.fuzzing.spring.SpringBeanValueProvider
4748import org.utbot.fuzzing.utils.Trie
4849import org.utbot.instrumentation.ConcreteExecutor
@@ -390,11 +391,22 @@ class UtBotSymbolicEngine(
390391 && applicationContext.typeReplacementApproach is TypeReplacementApproach .ReplaceIfPossible
391392 ) { provider ->
392393 val relevantRepositories = concreteExecutor.getRelevantSpringRepositories(methodUnderTest.classId)
393- val generatedValueFieldIds = relevantRepositories.map {
394- repository -> FieldId (repository.entityClassId, " id" )
394+ logger.info { " Detected relevant repositories for class ${methodUnderTest.classId} : $relevantRepositories " }
395+
396+ val generatedValueAnnotationClasses = SpringModelUtils .generatedValueClassIds.mapNotNull {
397+ @Suppress(" UNCHECKED_CAST" ) // type system fails to understand that GeneratedValue is indeed an annotation
398+ utContext.classLoader.tryLoadClass(it.name) as Class <out Annotation >?
395399 }
396400
397- logger.info { " Detected relevant repositories for class ${methodUnderTest.classId} : $relevantRepositories " }
401+ val generatedValueFieldIds =
402+ relevantRepositories
403+ .map { it.entityClassId.jClass }
404+ .flatMap { entityClass -> generateSequence(entityClass) { it.superclass } }
405+ .flatMap { it.declaredFields.toList() }
406+ .filter { field -> generatedValueAnnotationClasses.any { field.isAnnotationPresent(it) } }
407+ .map { it.fieldId }
408+ logger.info { " Detected @GeneratedValue fields: $generatedValueFieldIds " }
409+
398410 // spring should try to generate bean values, but if it fails, then object value provider is used for it
399411 val springBeanValueProvider = SpringBeanValueProvider (
400412 defaultIdGenerator,
@@ -408,7 +420,7 @@ class UtBotSymbolicEngine(
408420 provider
409421 .except { p -> p is ObjectValueProvider }
410422 .with (springBeanValueProvider)
411- .with (ValueProvider .of(relevantRepositories.map { SavedEntityProvider (defaultIdGenerator, it) }))
423+ .with (ValueProvider .of(relevantRepositories.map { SavedEntityValueProvider (defaultIdGenerator, it) }))
412424 .with (ValueProvider .of(generatedValueFieldIds.map { FieldValueProvider (defaultIdGenerator, it) }))
413425 }.let (transform)
414426 runJavaFuzzing(
0 commit comments