Spring Test Framework和基于注释的自动装配问题

时间:2010-07-08 03:59:37

标签: unit-testing spring autowired spring-test

我想对Spring的testframework使用两种不同的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名称   bean类的'userDAO'   [jpadao.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 个答案:

答案 0 :(得分:2)

你正在使用没有名字的bean,所以Spring会尝试提出一个名字,这个名字可能基于你可能在你的班级上有的@Component注释,但它也可能是你的版本你的bean的非限定类名(在两种情况下,它们都会相等,并导致Spring对象)。

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

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

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

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

答案 1 :(得分:1)

  1. 做我所建议的:更好地命名你的实现类(例如,HibernateUserDao和JpaUserDao);或者通过UserDAO实现类上的@Component或@Repository注释指定唯一的bean名称。
  2. 如果没有自动装配,您目前无法运行测试。有关详细信息,请参阅此JIRA问题:https://jira.springsource.org/browse/SPR-6050
  3. 此致

    Sam(Spring TestContext Framework的作者)

    P.S。不,您遇到的问题与SPR-4524无关。

答案 2 :(得分:0)

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

答案 3 :(得分: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相关吗?