gpt4 book ai didi

java - 让 Broadleaf 在单元测试中运行

转载 作者:行者123 更新时间:2023-12-01 05:08:16 25 4
gpt4 key购买 nike

我正在尝试让 Broadleaf Commerce 在一个简单的 JUnit 单元测试中运行,作为概念证明,看看我是否可以执行基本的购物车操作,例如添加到购物车、更新数量和下订单 - 无需用户界面。

看看我是否可以使用完全不同的 UI,以 Broadleaf 作为后端。

到目前为止,这工作起来有点困难(只是为了让 spring 上下文启动并运行)。我正在使用 Gradle 来构建我的项目。配置如下:

测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({
"MyTest.xml",
})
public class BltMainTest {

@Test
public void test() {
System.out.println("THIS IS A TEST");
}

}

MyTest.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
">

<import resource="classpath:bl-framework-applicationContext-persistence.xml"/>
<import resource="classpath:bl-framework-applicationContext-entity.xml"/>
<import resource="classpath:bl-framework-applicationContext-workflow.xml"/>
<import resource="classpath:bl-framework-applicationContext.xml"/>
<import resource="classpath:bl-profile-applicationContext.xml"/>
<import resource="classpath:bl-profile-applicationContext-entity.xml"/>
<import resource="classpath:bl-profile-applicationContext-persistence.xml"/>

</beans>

build.gradle 摘录(必须做一些修改才能使 ehcache 能够针对 Maven Central 工作,但不完全确定原因):

...
dependencies {
...
compile 'net.sf.ehcache:ehcache-core:2.6.0'

compile('org.broadleafcommerce:broadleaf-framework:1.6.1-GA') {
exclude module: 'ehcache-terracotta'
exclude module: 'ehcache'
}
compile('org.broadleafcommerce:broadleaf-profile:1.6.1-GA') {
exclude module: 'ehcache-terracotta'
exclude module: 'ehcache'
}
...
}

我得到的堆栈跟踪相当长,但最底部(并且我相信相关)部分是这样的:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'blEntityManagerFactorySecureInfo' defined in class path resource [bl-framework-applicationContext-persistence.xml]: Invocation of init method failed; nested exception is java.lang.NullPointerException
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.orm.jpa.EntityManagerFactoryUtils.findEntityManagerFactory(EntityManagerFactoryUtils.java:99)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findNamedEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:511)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:493)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.resolveEntityManager(PersistenceAnnotationBeanPostProcessor.java:657)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.getResourceToInject(PersistenceAnnotationBeanPostProcessor.java:630)
at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:150)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:339)
... 55 more
Caused by: java.lang.NullPointerException
at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:527)
at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:73)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:268)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
... 69 more

从类来看,似乎有一个未指定的持久性单元 - 但我不确定在哪里寻找纠正该问题的方法。

最重要的是,当我更改 config.xml 文件中 Spring 导入行的顺序时,错误会发生变化。

也许我正在以错误的方式处理这个问题,但我假设我应该能够通过以正确的顺序包含默认的 Broadleaf Spring XML 来实现这一点 - 但我已经尝试了其中的一些,但没有成功(有些相同的错误,有些不同,都不好)。

关于如何让它发挥作用有什么想法吗?

最佳答案

经过深入研究后,我确实做到了这一点。需要一些具体的东西:

  1. 原始帖子中的堆栈跟踪是由在两个不同的 Spring 上下文文件中定义的 blPersistenceUnitManager bean 引起的(不确定这些文件如何在正常的 Broadleaf 设置中合并),其中一个覆盖了另一个。解决方案是在导入组合配置的所有内容后定义一个,以便从所需的每个持久性单元中读取。
  2. 我必须明确使用 3.6.8.Final Hibernate 库,而不是最新的 4.x(一些奇怪的错误,无法弄清楚如何处理 Map 类型的列)
  3. 必须定义 blPasswordEncoder bean
  4. 注意:需要使用下面示例中的 blCacheManager bean 来解决 EHCache 问题:http://jira.broadleafcommerce.org/browse/BLC-599

这是最终起作用的 Spring 上下文的核心内容:

<import resource="classpath:bl-common-applicationContext.xml"/>

<import resource="classpath:bl-framework-applicationContext.xml"/>
<import resource="classpath:bl-profile-applicationContext.xml"/>

<import resource="classpath:bl-framework-applicationContext-workflow.xml"/>

<import resource="classpath:bl-framework-applicationContext-persistence.xml"/>
<import resource="classpath:bl-profile-applicationContext-persistence.xml"/>

<import resource="classpath:bl-framework-applicationContext-entity.xml"/>
<import resource="classpath:bl-profile-applicationContext-entity.xml"/>

<bean id="blCacheManager" class="org.broadleafcommerce.common.extensibility.cache.ehcache.MergeEhCacheManagerFactoryBean">
<property name="shared" value="true"/>
</bean>

<bean id="blPersistenceUnitManager" class="org.broadleafcommerce.common.extensibility.jpa.MergePersistenceUnitManager">
<property name="persistenceXmlLocations">
<list>
<value>classpath*:/META-INF/persistence-common.xml</value>
<value>classpath*:/META-INF/persistence-framework.xml</value>
<value>classpath*:/META-INF/persistence-profile.xml</value>
</list>
</property>
</bean>

<bean id="blPasswordEncoder" class="org.springframework.security.authentication.encoding.PlaintextPasswordEncoder"/>

这让我到了单元测试构建、运行、Hibernate 环境启动、我可以 @Resource() 之类的地步。还不确定它的功能如何,但我想我应该发布既然我已经说到这里了,就回答这个问题吧。

关于java - 让 Broadleaf 在单元测试中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12419640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com