diff --git a/utbot-framework/src/main/kotlin/org/utbot/framework/codegen/domain/Domain.kt b/utbot-framework/src/main/kotlin/org/utbot/framework/codegen/domain/Domain.kt index e94e5c9f5e..f7cb1fb1cd 100644 --- a/utbot-framework/src/main/kotlin/org/utbot/framework/codegen/domain/Domain.kt +++ b/utbot-framework/src/main/kotlin/org/utbot/framework/codegen/domain/Domain.kt @@ -757,9 +757,12 @@ object SpringBoot : DependencyInjectionFramework( * * Used as a key in [valueByUtModelWrapper]. * Was introduced primarily for shared among all test methods global variables. + * + * `modelTagName` is used to distinguish between variables with annotation @Mock that have the same model */ data class UtModelWrapper( val testSetId: Int, val executionId: Int, - val model: UtModel + val model: UtModel, + val modelTagName: String? ) diff --git a/utbot-framework/src/main/kotlin/org/utbot/framework/codegen/domain/context/CgContext.kt b/utbot-framework/src/main/kotlin/org/utbot/framework/codegen/domain/context/CgContext.kt index 5baae6eee2..4aa883bf97 100644 --- a/utbot-framework/src/main/kotlin/org/utbot/framework/codegen/domain/context/CgContext.kt +++ b/utbot-framework/src/main/kotlin/org/utbot/framework/codegen/domain/context/CgContext.kt @@ -451,7 +451,7 @@ interface CgContextOwner { val getLambdaMethod: MethodId get() = utilMethodProvider.getLambdaMethodMethodId - fun UtModel.wrap(): UtModelWrapper + fun UtModel.wrap(modelTagName: String? = null): UtModelWrapper } /** @@ -580,11 +580,12 @@ class CgContext( } } - override fun UtModel.wrap(): UtModelWrapper = + override fun UtModel.wrap(modelTagName: String?): UtModelWrapper = UtModelWrapper( testSetId = currentTestSetId, executionId = currentExecutionId, - model = this + model = this, + modelTagName = modelTagName ) private fun createClassIdForNestedClass(testClassModel: SimpleTestClassModel): ClassId { diff --git a/utbot-framework/src/main/kotlin/org/utbot/framework/codegen/domain/models/builders/SpringTestClassModelBuilder.kt b/utbot-framework/src/main/kotlin/org/utbot/framework/codegen/domain/models/builders/SpringTestClassModelBuilder.kt index fd82175d24..76da5b7899 100644 --- a/utbot-framework/src/main/kotlin/org/utbot/framework/codegen/domain/models/builders/SpringTestClassModelBuilder.kt +++ b/utbot-framework/src/main/kotlin/org/utbot/framework/codegen/domain/models/builders/SpringTestClassModelBuilder.kt @@ -83,7 +83,10 @@ class SpringTestClassModelBuilder(val context: CgContext): TestClassModelBuilder private fun collectByModel(model: UtModel): Set { val dependentModels = mutableSetOf() - collectRecursively(model, dependentModels) + + with(context){ + collectRecursively(model.wrap(), dependentModels) + } return dependentModels } @@ -98,49 +101,54 @@ class SpringTestClassModelBuilder(val context: CgContext): TestClassModelBuilder return classModels } - private fun collectRecursively(currentModel: UtModel, allModels: MutableSet) { - val cgModel = with(context) { currentModel.wrap() } - if (!allModels.add(cgModel)) { + private fun collectRecursively(currentModelWrapper: UtModelWrapper, allModels: MutableSet) { + if (!allModels.add(currentModelWrapper)) { return } - when (currentModel) { - is UtNullModel, - is UtPrimitiveModel, - is UtClassRefModel, - is UtVoidModel, - is UtEnumConstantModel, - is UtSpringContextModel -> {} - is UtLambdaModel -> { - currentModel.capturedValues.forEach { collectRecursively(it, allModels) } - } - is UtArrayModel -> { - currentModel.stores.values.forEach { collectRecursively(it, allModels) } - if (currentModel.stores.count() < currentModel.length) { - collectRecursively(currentModel.constModel, allModels) + with(context) { + when (val currentModel = currentModelWrapper.model) { + is UtNullModel, + is UtPrimitiveModel, + is UtClassRefModel, + is UtVoidModel, + is UtEnumConstantModel, + is UtSpringContextModel -> {} + is UtLambdaModel -> { + currentModel.capturedValues.forEach { collectRecursively(it.wrap(), allModels) } } - } - is UtCompositeModel -> { - // Here we traverse fields only. - // Traversing mocks as well will result in wrong models playing - // a role of class fields with @Mock annotation. - currentModel.fields.values.forEach { collectRecursively(it, allModels) } - } - is UtAssembleModel -> { - currentModel.origin?.let { collectRecursively(it, allModels) } + is UtArrayModel -> { + currentModel.stores.values.forEach { collectRecursively(it.wrap(), allModels) } + if (currentModel.stores.count() < currentModel.length) { + collectRecursively(currentModel.constModel.wrap(), allModels) + } + } + is UtCompositeModel -> { + // Here we traverse fields only. + // Traversing mocks as well will result in wrong models playing + // a role of class fields with @Mock annotation. + currentModel.fields.forEach { (fieldId, model) -> + // We use `modelTagName` in order to distinguish mock models + val modeTagName = if(model.isMockModel()) fieldId.name else null + collectRecursively(model.wrap(modeTagName), allModels) + } + } + is UtAssembleModel -> { + currentModel.origin?.let { collectRecursively(it.wrap(), allModels) } - currentModel.instantiationCall.instance?.let { collectRecursively(it, allModels) } - currentModel.instantiationCall.params.forEach { collectRecursively(it, allModels) } + currentModel.instantiationCall.instance?.let { collectRecursively(it.wrap(), allModels) } + currentModel.instantiationCall.params.forEach { collectRecursively(it.wrap(), allModels) } - currentModel.modificationsChain.forEach { stmt -> - stmt.instance?.let { collectRecursively(it, allModels) } - when (stmt) { - is UtStatementCallModel -> stmt.params.forEach { collectRecursively(it, allModels) } - is UtDirectSetFieldModel -> collectRecursively(stmt.fieldModel, allModels) + currentModel.modificationsChain.forEach { stmt -> + stmt.instance?.let { collectRecursively(it.wrap(), allModels) } + when (stmt) { + is UtStatementCallModel -> stmt.params.forEach { collectRecursively(it.wrap(), allModels) } + is UtDirectSetFieldModel -> collectRecursively(stmt.fieldModel.wrap(), allModels) + } } } + //Python, JavaScript, Go models are not required in Spring } - //Python, JavaScript, Go models are not required in Spring } } } \ No newline at end of file diff --git a/utbot-framework/src/main/kotlin/org/utbot/framework/codegen/tree/CgAbstractSpringTestClassConstructor.kt b/utbot-framework/src/main/kotlin/org/utbot/framework/codegen/tree/CgAbstractSpringTestClassConstructor.kt index e497d835ef..81ce6e6feb 100644 --- a/utbot-framework/src/main/kotlin/org/utbot/framework/codegen/tree/CgAbstractSpringTestClassConstructor.kt +++ b/utbot-framework/src/main/kotlin/org/utbot/framework/codegen/tree/CgAbstractSpringTestClassConstructor.kt @@ -1,5 +1,6 @@ package org.utbot.framework.codegen.tree +import org.utbot.framework.codegen.domain.UtModelWrapper import org.utbot.framework.codegen.domain.builtin.TestClassUtilMethodProvider import org.utbot.framework.codegen.domain.context.CgContext import org.utbot.framework.codegen.domain.models.AnnotationTarget.* @@ -21,7 +22,6 @@ import org.utbot.framework.plugin.api.UtSpringContextModel import org.utbot.framework.plugin.api.util.SpringModelUtils.getBeanNameOrNull import org.utbot.framework.plugin.api.util.id import java.lang.Exception -import java.util.Collections.max abstract class CgAbstractSpringTestClassConstructor(context: CgContext) : CgAbstractTestClassConstructor(context) { @@ -125,10 +125,18 @@ abstract class CgAbstractSpringTestClassConstructor(context: CgContext) : modelWrappers .forEach { modelWrapper -> - modelWrapper.let { - valueByUtModelWrapper[modelWrapper] = createdVariable - variableConstructor.annotatedModelGroups.getOrPut(annotationClassId) { mutableSetOf() } += modelWrapper - } + + val modelWrapperWithNullTagName = UtModelWrapper( + testSetId = modelWrapper.testSetId, + executionId = modelWrapper.executionId, + model = modelWrapper.model, + modelTagName = null, + ) + + valueByUtModelWrapper[modelWrapperWithNullTagName] = createdVariable + + variableConstructor.annotatedModelGroups + .getOrPut(annotationClassId) { mutableSetOf() } += modelWrapperWithNullTagName } } diff --git a/utbot-framework/src/main/kotlin/org/utbot/framework/codegen/tree/CgClassFieldManager.kt b/utbot-framework/src/main/kotlin/org/utbot/framework/codegen/tree/CgClassFieldManager.kt index 7056e5ea20..15ffbc387b 100644 --- a/utbot-framework/src/main/kotlin/org/utbot/framework/codegen/tree/CgClassFieldManager.kt +++ b/utbot-framework/src/main/kotlin/org/utbot/framework/codegen/tree/CgClassFieldManager.kt @@ -14,7 +14,7 @@ import org.utbot.framework.plugin.api.UtModel import org.utbot.framework.plugin.api.isMockModel import org.utbot.framework.plugin.api.util.SpringModelUtils.autowiredClassId import org.utbot.framework.plugin.api.util.SpringModelUtils.isAutowiredFromContext -import java.util.* +import java.util.Collections.max import kotlin.collections.HashMap sealed interface CgClassFieldManager : CgContextOwner { @@ -88,15 +88,16 @@ class CgMockedFieldsManager(context: CgContext) : CgClassFieldManagerImpl(contex override fun fieldWithAnnotationIsRequired(modelWrappers: Set): Boolean { // group [listOfUtModels] by `testSetId` and `executionId` // to check how many instances of one type are used in each execution - val modelsByExecutions = modelWrappers + val modelWrappersByExecutions = modelWrappers .groupByTo(HashMap()) { Pair(it.testSetId, it.executionId) } - // maximal instances of one type amount in one execution - val instanceMaxCount = Collections.max(modelsByExecutions.map { (_, modelsList) -> modelsList.size }) + // maximal count of instances of the same type amount in one execution + // we use `modelTagName` in order to distinguish mock models by their name + val maxCountOfInstancesOfTheSameTypeByExecution = max(modelWrappersByExecutions.map { (_, modelsList) -> modelsList.size }) - // if [instanceCount] is 1, then we mock variable by @Mock annotation + // if [maxCountOfInstancesOfTheSameTypeByExecution] is 1, then we mock variable by @Mock annotation // Otherwise we will mock variable by simple mock later - return instanceMaxCount == 1 + return maxCountOfInstancesOfTheSameTypeByExecution == 1 } } diff --git a/utbot-spring-sample/src/main/java/org/utbot/examples/spring/autowiring/twoAndMoreBeansForOneType/Person.java b/utbot-spring-sample/src/main/java/org/utbot/examples/spring/autowiring/twoAndMoreBeansForOneType/Person.java index 11522fcac4..64c9cb9d91 100644 --- a/utbot-spring-sample/src/main/java/org/utbot/examples/spring/autowiring/twoAndMoreBeansForOneType/Person.java +++ b/utbot-spring-sample/src/main/java/org/utbot/examples/spring/autowiring/twoAndMoreBeansForOneType/Person.java @@ -12,11 +12,11 @@ public Person(String firstName, String secondName, Integer age) { this.age = age; } - public Integer getAge(){ - return age; + public String getName() { + return firstName + " " + lastName; } - public String name() { - return firstName + " " + lastName; + public Integer getAge(){ + return age; } } \ No newline at end of file diff --git a/utbot-spring-sample/src/main/java/org/utbot/examples/spring/autowiring/twoAndMoreBeansForOneType/PersonConfig.java b/utbot-spring-sample/src/main/java/org/utbot/examples/spring/autowiring/twoAndMoreBeansForOneType/PersonConfig.java deleted file mode 100644 index 78f2faf0c1..0000000000 --- a/utbot-spring-sample/src/main/java/org/utbot/examples/spring/autowiring/twoAndMoreBeansForOneType/PersonConfig.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.utbot.examples.spring.autowiring.twoAndMoreBeansForOneType; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class PersonConfig { - @Bean - public Person personOne() { - return new Person("Eg", "or", 7); - } - - @Bean - public Person personTwo() { - return new Person("Kir", "ill", 6); - } -} diff --git a/utbot-spring-sample/src/main/java/org/utbot/examples/spring/autowiring/twoAndMoreBeansForOneType/PersonService.java b/utbot-spring-sample/src/main/java/org/utbot/examples/spring/autowiring/twoAndMoreBeansForOneType/PersonService.java deleted file mode 100644 index 91162dc0ce..0000000000 --- a/utbot-spring-sample/src/main/java/org/utbot/examples/spring/autowiring/twoAndMoreBeansForOneType/PersonService.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.utbot.examples.spring.autowiring.twoAndMoreBeansForOneType; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -public class PersonService { - @Autowired - private Person personOne; - - @Autowired - private Person personTwo; - - public Integer ageSum(){ - return personOne.getAge() + personTwo.getAge(); - } -} \ No newline at end of file diff --git a/utbot-spring-sample/src/main/java/org/utbot/examples/spring/autowiring/twoAndMoreBeansForOneType/ServiceOfBeansWithSameType.java b/utbot-spring-sample/src/main/java/org/utbot/examples/spring/autowiring/twoAndMoreBeansForOneType/ServiceOfBeansWithSameType.java new file mode 100644 index 0000000000..bf4f045e80 --- /dev/null +++ b/utbot-spring-sample/src/main/java/org/utbot/examples/spring/autowiring/twoAndMoreBeansForOneType/ServiceOfBeansWithSameType.java @@ -0,0 +1,28 @@ +package org.utbot.examples.spring.autowiring.twoAndMoreBeansForOneType; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class ServiceOfBeansWithSameType { + @Autowired + private Person personOne; + + @Autowired + private Person personTwo; + + public final List baseOrders = new ArrayList<>(); + + // a method for testing the case when the Engine produces one model on @Autowired variables of the same type + public Integer ageSum(){ + return personOne.getAge() + personTwo.getAge(); + } + + // a method for testing the case when the Engine produces two models on @Autowired variables of the same type + public Boolean checker() { + return personOne.getName().equals("k") && personTwo.getName().length() > 5 && baseOrders.isEmpty(); + } +} \ No newline at end of file diff --git a/utbot-spring-test/src/test/kotlin/org/utbot/examples/spring/autowiring/oneBeanForOneType/SpringNoConfigUtValueTestCaseChecker.kt b/utbot-spring-test/src/test/kotlin/org/utbot/examples/spring/autowiring/SpringNoConfigUtValueTestCaseChecker.kt similarity index 87% rename from utbot-spring-test/src/test/kotlin/org/utbot/examples/spring/autowiring/oneBeanForOneType/SpringNoConfigUtValueTestCaseChecker.kt rename to utbot-spring-test/src/test/kotlin/org/utbot/examples/spring/autowiring/SpringNoConfigUtValueTestCaseChecker.kt index 3e0e66241b..ed54103277 100644 --- a/utbot-spring-test/src/test/kotlin/org/utbot/examples/spring/autowiring/oneBeanForOneType/SpringNoConfigUtValueTestCaseChecker.kt +++ b/utbot-spring-test/src/test/kotlin/org/utbot/examples/spring/autowiring/SpringNoConfigUtValueTestCaseChecker.kt @@ -1,4 +1,4 @@ -package org.utbot.examples.spring.autowiring.oneBeanForOneType +package org.utbot.examples.spring.autowiring import org.utbot.examples.spring.utils.standardSpringTestingConfigurations import org.utbot.testing.UtValueTestCaseChecker diff --git a/utbot-spring-test/src/test/kotlin/org/utbot/examples/spring/autowiring/oneBeanForOneType/ServiceWithInjectedAndNonInjectedFieldTests.kt b/utbot-spring-test/src/test/kotlin/org/utbot/examples/spring/autowiring/oneBeanForOneType/ServiceWithInjectedAndNonInjectedFieldTests.kt index ad94545d4b..f86ddf9101 100644 --- a/utbot-spring-test/src/test/kotlin/org/utbot/examples/spring/autowiring/oneBeanForOneType/ServiceWithInjectedAndNonInjectedFieldTests.kt +++ b/utbot-spring-test/src/test/kotlin/org/utbot/examples/spring/autowiring/oneBeanForOneType/ServiceWithInjectedAndNonInjectedFieldTests.kt @@ -1,6 +1,7 @@ package org.utbot.examples.spring.autowiring.oneBeanForOneType import org.junit.jupiter.api.Test +import org.utbot.examples.spring.autowiring.SpringNoConfigUtValueTestCaseChecker import org.utbot.examples.spring.utils.findAllRepositoryCall import org.utbot.examples.spring.utils.springAdditionalDependencies import org.utbot.examples.spring.utils.springMockStrategy diff --git a/utbot-spring-test/src/test/kotlin/org/utbot/examples/spring/autowiring/oneBeanForOneType/ServiceWithInjectedFieldTests.kt b/utbot-spring-test/src/test/kotlin/org/utbot/examples/spring/autowiring/oneBeanForOneType/ServiceWithInjectedFieldTests.kt index b051d491f6..c123d7f2bd 100644 --- a/utbot-spring-test/src/test/kotlin/org/utbot/examples/spring/autowiring/oneBeanForOneType/ServiceWithInjectedFieldTests.kt +++ b/utbot-spring-test/src/test/kotlin/org/utbot/examples/spring/autowiring/oneBeanForOneType/ServiceWithInjectedFieldTests.kt @@ -1,6 +1,7 @@ package org.utbot.examples.spring.autowiring.oneBeanForOneType import org.junit.jupiter.api.Test +import org.utbot.examples.spring.autowiring.SpringNoConfigUtValueTestCaseChecker import org.utbot.examples.spring.utils.findAllRepositoryCall import org.utbot.examples.spring.utils.saveRepositoryCall import org.utbot.examples.spring.utils.springAdditionalDependencies diff --git a/utbot-spring-test/src/test/kotlin/org/utbot/examples/spring/autowiring/twoAndMoreBeansForOneType/ServiceOfBeansWithSameTypeTest.kt b/utbot-spring-test/src/test/kotlin/org/utbot/examples/spring/autowiring/twoAndMoreBeansForOneType/ServiceOfBeansWithSameTypeTest.kt new file mode 100644 index 0000000000..d57d546470 --- /dev/null +++ b/utbot-spring-test/src/test/kotlin/org/utbot/examples/spring/autowiring/twoAndMoreBeansForOneType/ServiceOfBeansWithSameTypeTest.kt @@ -0,0 +1,144 @@ +package org.utbot.examples.spring.autowiring.twoAndMoreBeansForOneType + +import org.junit.jupiter.api.Test +import org.utbot.examples.spring.autowiring.SpringNoConfigUtValueTestCaseChecker +import org.utbot.examples.spring.utils.* +import org.utbot.framework.plugin.api.UtConcreteValue +import org.utbot.testcheckers.eq +import org.utbot.testing.* + +class ServiceOfBeansWithSameTypeTest : SpringNoConfigUtValueTestCaseChecker( + testClass = ServiceOfBeansWithSameType::class, +) { + + /** + * In this test, we check the case when the Engine produces two models on two @Autowired variables of the same type. + * + * The engine produce two models only in the tests, when `baseOrder` is a testing participant. + * In these tests, we mock all the variables and get the only necessary `mock.values` in each variable. + */ + @Test + fun testChecker() { + checkThisMocksAndExceptions( + method = ServiceOfBeansWithSameType::checker, + branches = eq(6), + {_, mocks, r -> + val personOne = mocks.singleMock("personOne", namePersonCall) + + val personOneName = personOne.value() + + val r1 = personOneName == null + + r1 && r.isException() + }, + {_, mocks, r -> + val person = mocks.singleMock("personOne", namePersonCall) + + val personOneName = (person.values[0] as? UtConcreteValue<*>)?.value + val personTwoName = (person.values[1] as? UtConcreteValue<*>)?.value + + val r1 = personOneName == "k" + val r2 = personTwoName == null + + r1 && r2 && r.isException() + }, + {_, mocks, r -> + val personOne = mocks.singleMock("personOne", namePersonCall) + + val personOneName = personOne.value() + + val r1 = personOneName != "k" + + r1 && (r.getOrNull() == false) + }, + {_, mocks, r -> + val person = mocks.singleMock("personOne", namePersonCall) + + val personOneName = (person.values[0] as? UtConcreteValue<*>)?.value + val personTwoName = (person.values[1] as? UtConcreteValue<*>)?.value.toString() + + val r1 = personOneName == "k" + val r2 = personTwoName.length <= 5 + + r1 && r2 && (r.getOrNull() == false) + }, + + //In this test Engine produces two models on two @Autowired variables of the same type + {thisInstance, mocks, r -> + val personOne = mocks.singleMock("personOne", namePersonCall) + val personTwo = mocks.singleMock("personTwo", namePersonCall) + + val personOneName = (personOne.values[0] as? UtConcreteValue<*>)?.value + val personTwoName = (personTwo.values[0] as? UtConcreteValue<*>)?.value.toString() + val baseOrders = thisInstance.baseOrders + + val r1 = personOneName == "k" + val r2 = personTwoName.length > 5 + val r3 = baseOrders.isEmpty() + + r1 && r2 && r3 && (r.getOrNull() == true) + }, + + {thisInstance, mocks, r -> + val personOne = mocks.singleMock("personOne", namePersonCall) + val personTwo = mocks.singleMock("personTwo", namePersonCall) + + val personOneName = (personOne.values[0] as? UtConcreteValue<*>)?.value + val personTwoName = (personTwo.values[0] as? UtConcreteValue<*>)?.value.toString() + val baseOrders = thisInstance.baseOrders + + val r1 = personOneName == "k" + val r2 = personTwoName.length > 5 + val r3 = baseOrders.isNotEmpty() + + r1 && r2 && r3 && (r.getOrNull() == false) + }, + coverage = DoNotCalculate, + mockStrategy = springMockStrategy, + additionalDependencies = springAdditionalDependencies, + ) + } + + /** + * In this test, we check the case when the Engine produces one model on two @Autowired variables of the same type. + * + * Therefore, we only mock one of the variables and get all `mock.values` in it + */ + @Test + fun testAgeSum(){ + checkThisMocksAndExceptions( + method = ServiceOfBeansWithSameType::ageSum, + branches = eq(3), + { _, mocks, r -> + val personOne = mocks.singleMock("personOne", agePersonCall) + + val personOneAge = (personOne.values[0] as? UtConcreteValue<*>)?.value + val isPersonOneAgeNull = personOneAge == null + + isPersonOneAgeNull && r.isException() + }, + { _, mocks, r -> + val personOne = mocks.singleMock("personOne", agePersonCall) + + val personOneAge = (personOne.values[0] as? UtConcreteValue<*>)?.value + val personTwoAge = (personOne.values[1] as? UtConcreteValue<*>)?.value + + val isPersonOneAgeNull = personOneAge != null + val isPersonTwoAgeNotNull = personTwoAge == null + + isPersonOneAgeNull && isPersonTwoAgeNotNull && r.isException() + }, + { _, mocks, r -> + val personOne = mocks.singleMock("personOne", agePersonCall) + + val personOneAge = (personOne.values[0] as? UtConcreteValue<*>)?.value.toString().toInt() + val personTwoAge = (personOne.values[1] as? UtConcreteValue<*>)?.value.toString().toInt() + + personOneAge + personTwoAge == r.getOrNull() + }, + coverage = DoNotCalculate, + mockStrategy = springMockStrategy, + additionalDependencies = springAdditionalDependencies, + ) + } +} diff --git a/utbot-spring-test/src/test/kotlin/org/utbot/examples/spring/utils/CallUtils.kt b/utbot-spring-test/src/test/kotlin/org/utbot/examples/spring/utils/CallUtils.kt index 98ee4e02cf..86cb0648e4 100644 --- a/utbot-spring-test/src/test/kotlin/org/utbot/examples/spring/utils/CallUtils.kt +++ b/utbot-spring-test/src/test/kotlin/org/utbot/examples/spring/utils/CallUtils.kt @@ -2,6 +2,7 @@ package org.utbot.examples.spring.utils import org.utbot.examples.spring.autowiring.OrderRepository import org.utbot.examples.spring.autowiring.oneBeanForOneType.Order +import org.utbot.examples.spring.autowiring.twoAndMoreBeansForOneType.Person import kotlin.reflect.KFunction1 import kotlin.reflect.KFunction2 import kotlin.reflect.full.functions @@ -19,4 +20,19 @@ val saveRepositoryCall: KFunction2 = OrderRepository::class .functions .single { it.name == "save" && it.parameters.size == 2 } - as KFunction2 \ No newline at end of file + as KFunction2 + + +@Suppress("UNCHECKED_CAST") +val namePersonCall: KFunction1 = + Person::class + .functions + .single { it.name == "getName" && it.parameters.size == 1 } + as KFunction1 + +@Suppress("UNCHECKED_CAST") +val agePersonCall: KFunction1 = + Person::class + .functions + .single { it.name == "getAge" && it.parameters.size == 1 } + as KFunction1 \ No newline at end of file