首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >狂妄自大综合试验

狂妄自大综合试验
EN

Stack Overflow用户
提问于 2022-10-18 10:56:09
回答 1查看 49关注 0票数 0

我对傲慢很陌生,在为我的服务编写集成测试时遇到了一些麻烦。我将方法添加到现有的服务UserService getUsersWithoutAddresses()中。现在我正在尝试编写Integration,但是当我试图模拟我的函数时,它会抛出异常。

代码语言:javascript
运行
复制
    @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));



    }

当我试图用Adress保存UserModel时,它抛出一个异常

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

发布于 2022-11-18 00:12:03

从日志判断,您正在运行一个来自IntelliJ Idea的测试。尝试使用控制台中的ant任务运行它:

代码语言:javascript
运行
复制
ant integrationtests -Dtestclasses.packages=your.test.class.package.TrainingUserServiceImplIntegrationTest

如果测试现在通过,那么IntelliJ运行测试的方式可能不会为某些扩展加载bean定义。

至于这个bean应该做什么,它用于从模型类的其他属性中计算属性line1的值,因为它有持久性类型dynamic而不是property

来自basecommerce-items.xml

代码语言:javascript
运行
复制
<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>

您还可以看到它将addressLine1Attribute定义为属性的处理程序。这是spring上下文中缺少的bean的名称,即使它是在basecommerce-spring.xml中配置的。

代码语言:javascript
运行
复制
<bean id="addressLine1Attribute" class="de.hybris.platform.basecommerce.model.AddressLine1Attribute"/>

该bean的Java类仅委托给streetnumber属性:

代码语言:javascript
运行
复制
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);
        }

    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74109806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档