春季测试框架和基于注释的自动控制问题
-
12-09-2020 - |
题
我想使用Spring的TestFramework的DAO的两种不同的实现。
src.main.java
.businessobjects
\-User.java
.dao
\-IUserDAO.java
.daojpa
\-UserDAO.java
.daohibernate
\-UserDAO.java
.
Spring TestCase:
src.test.java.base:
package base;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/hibernate-beans.xml")
@Transactional
public abstract class SpringTestCase {}
.
而且以下是错误:
由: java.lang.illegalstateException: 注释指定的bean名称 Bean类的'Userdao' [jpadao.userdao] 与现有的冲突, 不兼容的bean定义 姓名和班级 [jpaadao.userdao]
我已经尝试通过使用限定符来覆盖自动控制,例如:
<bean class="jpaadao.UserDAO">
<qualifier value="jpaa"/>
</bean>
<bean class="jpadao.UserDAO">
<qualifier value="jpa"/>
</bean>
.
然后在TestCase接线中使用
@Autowired
@Qualifier("jpa")
private IUserDAO userDAO;
.
但错误仍然存在。
两个问题:
- 如何通过基于注释的配置来解决这个问题?
- 如何运行测试而没有自动控制和注释?
解决方案
你正在使用没有姓名的bean,以便春天会尝试拿出一个名字,这个名字可以基于@component注释你大概有你的班级,但它也可以是你的骆驼证版本您bean的不合格类名称(在这两种情况下它们都会等于并且导致春天到对象)。
此外,您似乎正在将组件扫描和XML配置混合,以便对我有点奇数。
有很多方法,但最干净的是,你只能使用一个单一的bean,实现你尝试全氟的合同。如果您确实需要不同的实现,则应给出不同且更多的侮辱性名称:
<bean id="jpaUserRepository" class="..JpaUserRepository"/>
.
这将为您提供更有用的日志记录,即使从未使用Bean名称,因为您依赖自动接线。
其他提示
- 做Iwein建议的是:更好地命名你的实现类(例如,hibernateuserdao和jpauserdao);或者通过@Component或@Repository注释在userdao实现类上指定唯一的bean名称。
- 您当前不能在没有自动定向的情况下运行测试。有关详细信息: https://jira.springsource.org/browse/spr-6050
问候,
sam(Spring TestContext框架的作者)
p.s。不,你面临的问题与SPR-4524无关。
您可以尝试使用@Resource
注释注入依赖项旁姓。您必须将名称(IDS)提供给Bean或使用默认值,这是未销售的不合格类名称。
我现在已经起床了!但是,我不相信这是最好的做法。我通过写入appcontext.xml:
,我简单地排除了不需要的DAO的路径 <context:component-scan base-package="test">
<context:exclude-filter type="regex" expression="test\.daohibernate.*"></context:exclude-filter>
</context:component-scan>
.
任何建议?这个问题可能与 http://jira.springframework.org/browse/spr-4524 ?