Pertsh Galstyan
Pertsh Galstyan

Reputation: 51

Hybris Integration Test

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

Answers (1)

sjakovac
sjakovac

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

Related Questions