我想使用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;
.

但错误仍然存在。

两个问题:

  1. 如何通过基于注释的配置来解决这个问题?
  2. 如何运行测试而没有自动控制和注释?
有帮助吗?

解决方案

你正在使用没有姓名的bean,以便春天会尝试拿出一个名字,这个名字可以基于@component注释你大概有你的班级,但它也可以是你的骆驼证版本您bean的不合格类名称(在这两种情况下它们都会等于并且导致春天到对象)。

此外,您似乎正在将组件扫描和XML配置混合,以便对我有点奇数。

有很多方法,但最干净的是,你只能使用一个单一的bean,实现你尝试全氟的合同。如果您确实需要不同的实现,则应给出不同且更多的侮辱性名称:

<bean id="jpaUserRepository" class="..JpaUserRepository"/>
.

这将为您提供更有用的日志记录,即使从未使用Bean名称,因为您依赖自动接线。

其他提示

  1. 做Iwein建议的是:更好地命名你的实现类(例如,hibernateuserdao和jpauserdao);或者通过@Component或@Repository注释在userdao实现类上指定唯一的bean名称。
  2. 您当前不能在没有自动定向的情况下运行测试。有关详细信息: https://jira.springsource.org/browse/spr-6050
  3. 问候,

    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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top