Reputation: 51
I am new to hybris and I got some trouble while writing Integration Test for My service . I Added method to existing Service UserService getUsersWithoutAddresses(). Now I am Trying to write Integration Test but its throws Exceptions when I am trying to simulate my function.
@IntegrationTest
public class TrainingUserServiceImplIntegrationTest extends ServicelayerTransactionalTest {
@Resource
private TrainingUserService trainingUserService;
@Resource
private ModelService modelService;
@Resource
private UserService userService;
@Before
public void setUp() {
}
@Test
public void getUsersWithoutAddressesTest(){
UserModel userWithoutAddress = new UserModel();
userWithoutAddress.setUid("testUser1");
UserModel userWithAddress = new UserModel();
userWithAddress.setUid("testUser2");
userWithAddress.setName("testUsername2");
AddressModel addressModel = new AddressModel();
addressModel.setOwner(userWithAddress);
addressModel.setLine1("some test address");
userWithAddress.setAddresses(Arrays.asList(addressModel));
modelService.save(userWithAddress);
modelService.save(userWithoutAddress);
assertTrue(trainingUserService.getUsersWithoutAddresses().contains(userWithoutAddress));
assertFalse(trainingUserService.getUsersWithoutAddresses().contains(userWithAddress));
}
its throw an exception when I am trying to save UserModel with the Adress
de.hybris.platform.servicelayer.exceptions.ModelSavingException: cannot find spring bean [addressLine1Attribute] configured for dynamic attribute [Address.line1] from extension [basecommerce]
at de.hybris.platform.servicelayer.internal.model.impl.DefaultModelService.saveAll(DefaultModelService.java:704)
at de.hybris.platform.servicelayer.internal.model.impl.DefaultModelService.save(DefaultModelService.java:643)
at com.epam.training.service.impl.TrainingUserServiceImplIntegrationTest.getUsersWithoutAddressesTest(TrainingUserServiceImplIntegrationTest.java:56)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at de.hybris.platform.testframework.HybrisJUnit4ClassRunner$TenantActivationNotAllowedRunBefores.evaluate(HybrisJUnit4ClassRunner.java:163)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at de.hybris.platform.testframework.HybrisJUnit4ClassRunner.superRun(HybrisJUnit4ClassRunner.java:116)
at de.hybris.platform.testframework.HybrisTestClassRunnerLogic.run(HybrisTestClassRunnerLogic.java:106)
at de.hybris.platform.testframework.HybrisJUnit4ClassRunner.run(HybrisJUnit4ClassRunner.java:67)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
Caused by: de.hybris.platform.servicelayer.exceptions.SystemException: cannot find spring bean [addressLine1Attribute] configured for dynamic attribute [Address.line1] from extension [basecommerce]
at de.hybris.platform.servicelayer.internal.converter.impl.ItemModelConverter.assembleMetaInfo(ItemModelConverter.java:1582)
at de.hybris.platform.servicelayer.internal.converter.impl.ItemModelConverter.getTypeMetaInfo(ItemModelConverter.java:378)
at de.hybris.platform.servicelayer.internal.converter.impl.ItemModelConverter.isConfiguredForLegacyPersistence(ItemModelConverter.java:415)
at de.hybris.platform.servicelayer.internal.model.impl.wrapper.ModelWrapper.isModelConverterConfiguredForLegacyPersistence(ModelWrapper.java:93)
at de.hybris.platform.servicelayer.internal.model.impl.wrapper.ModelWrapper.determineIfConfigureForLegacyPersistence(ModelWrapper.java:80)
at de.hybris.platform.servicelayer.internal.model.impl.wrapper.ModelWrapper.<init>(ModelWrapper.java:73)
at de.hybris.platform.servicelayer.internal.model.impl.wrapper.WrapperRegistry.createWrapper(WrapperRegistry.java:45)
at de.hybris.platform.servicelayer.internal.model.extractor.impl.CascadingModelWalker.processChildren(CascadingModelWalker.java:141)
at de.hybris.platform.servicelayer.internal.model.extractor.impl.CascadingModelWalker.processUnlocalizedAttributes(CascadingModelWalker.java:126)
at de.hybris.platform.servicelayer.internal.model.extractor.impl.CascadingModelWalker.walkThrough(CascadingModelWalker.java:70)
at de.hybris.platform.servicelayer.internal.model.extractor.impl.DefaultCascader.getNewModels(DefaultCascader.java:43)
at de.hybris.platform.servicelayer.internal.model.impl.wrapper.ModelWrapper.getModelsToCreate(ModelWrapper.java:148)
at de.hybris.platform.servicelayer.internal.model.impl.wrapper.ModelWrapper.executeInterceptorsAndCascade(ModelWrapper.java:119)
at de.hybris.platform.servicelayer.internal.model.extractor.impl.DefaultModelExtractor.process(DefaultModelExtractor.java:44)
at de.hybris.platform.servicelayer.internal.model.impl.DefaultModelService.performPersistenceOperations(DefaultModelService.java:720)
at de.hybris.platform.servicelayer.internal.model.impl.DefaultModelService.saveAllInternal(DefaultModelService.java:715)
at de.hybris.platform.servicelayer.internal.model.impl.DefaultModelService.saveAll(DefaultModelService.java:695)
... 32 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'addressLine1Attribute' available
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:687)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1218)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:284)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:275)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1086)
at de.hybris.platform.servicelayer.internal.converter.impl.ItemModelConverter.assembleMetaInfo(ItemModelConverter.java:1562)
... 48 more
Upvotes: 0
Views: 651
Reputation: 124
Judging by the log, you're running a test from IntelliJ Idea IDE. Try running it using ant
task from the console:
ant integrationtests -Dtestclasses.packages=your.test.class.package.TrainingUserServiceImplIntegrationTest
If the test now passes, it could be that IntelliJ way of running test doesn't load bean definitions for some of the extensions.
As for what that bean should do, it's used to calculate the value of attribute line1
from other attributes of model class since it has persistence type dynamic
instead of property
.
From basecommerce-items.xml:
<attribute qualifier="line1" type="java.lang.String">
<description>Address line1 is a dynamic attribute that is stored in the Address.streetname field</description>
<persistence type="dynamic" attributeHandler="addressLine1Attribute" />
</attribute>
You can also see it defines addressLine1Attribute
as the handler for the attribute. That is the name of the bean that is missing from the spring context even though it is configured in basecommerce-spring.xml
:
<bean id="addressLine1Attribute" class="de.hybris.platform.basecommerce.model.AddressLine1Attribute"/>
Java class for that bean just delegates to streetnumber
attribute:
package de.hybris.platform.basecommerce.model;
import de.hybris.platform.core.model.user.AddressModel;
import de.hybris.platform.servicelayer.model.attribute.AbstractDynamicAttributeHandler;
public class AddressLine1Attribute extends AbstractDynamicAttributeHandler<String, AddressModel> {
public AddressLine1Attribute() {
}
public String get(AddressModel addressModel) {
if (addressModel == null) {
throw new IllegalArgumentException("address model is required");
} else {
return addressModel.getStreetname();
}
}
public void set(AddressModel addressModel, String value) {
if (addressModel != null) {
addressModel.setStreetname(value);
}
}
}
Upvotes: 0