5

我想对带有 Spring 测试框架的 DAO 使用两种不同的实现。

src.main.java

.businessobjects
   \-User.java
.dao
   \-IUserDAO.java
.daojpa
   \-UserDAO.java
.daohibernate
   \-UserDAO.java

弹簧测试用例:

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 类 [jpadao.UserDAO] 的注解指定的 bean 名称“userDAO”与现有的、不兼容的同名和类 bean 定义冲突 [jpaadao.UserDAO]

我已经尝试通过使用限定符来覆盖自动装配,例如:

<bean class="jpaadao.UserDAO">
    <qualifier value="jpaa"/>
</bean>
<bean class="jpadao.UserDAO">
    <qualifier value="jpa"/>
</bean>

然后在测试用例中接线

@Autowired
@Qualifier("jpa")
private IUserDAO userDAO;

但错误仍然存​​在。

两个问题:

  1. 如何使用基于注释的配置来解决这个问题?
  2. 如何在没有自动装配和注释的情况下运行测试
4

4 回答 4

2

您正在使用没有名称的 bean,因此 Spring 将尝试提出一个名称,该名称可能基于您可能在您的类上拥有的 @Component 注释,但它也可能是您的非限定类的驼峰版本您的 bean 的名称(在这两种情况下,它们都会相等,这会导致 Spring 反对)。

此外,您似乎以一种对我来说有点奇怪的方式混合了组件扫描和 xml 配置。

有很多方法可以解决这个问题,但最干净的是,您将只使用一个 bean 来实现您试图完成的合同。如果你确实需要不同的实现,你应该给它们不同的和更具描述性的名称:

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

这将为您提供更有用的日志记录,即使由于您依赖自动连接而从未使用过 bean 名称。

于 2010-07-08T20:06:26.947 回答
1
  1. 按照 Iwein 的建议做:更好地命名您的实现类(例如,HibernateUserDao 和 JpaUserDao);或通过 UserDAO 实现类上的 @Component 或 @Repository 注释指定唯一的 bean 名称。
  2. 您当前无法在没有自动装配的情况下运行测试。有关详细信息,请参阅此 JIRA 问题:https ://jira.springsource.org/browse/SPR-6050

问候,

Sam(Spring TestContext 框架的作者)

ps 不,您面临的问题与 SPR-4524 无关。

于 2010-07-11T18:03:23.017 回答
0

我已经启动并运行了!但是,我认为这不是最佳做法。我只是通过写入 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有关吗?

于 2010-07-08T14:53:40.210 回答
0

@Resource您可以尝试使用注解按名称注入依赖项。您必须为 bean 提供名称(id)或使用默认值,即未大写的非限定类名称。

于 2010-07-08T05:52:56.500 回答