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

Ta *_*Sas 5 spring unit-testing spring-test autowired

我想对Spring的testframework使用两种不同的DAO实现.

src.main.java

.businessobjects
   \-User.java
.dao
   \-IUserDAO.java
.daojpa
   \-UserDAO.java
.daohibernate
   \-UserDAO.java
Run Code Online (Sandbox Code Playgroud)

春季测试案例:

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 {}
Run Code Online (Sandbox Code Playgroud)

这是错误:

引起: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>
Run Code Online (Sandbox Code Playgroud)

然后在测试用例中布线

@Autowired
@Qualifier("jpa")
private IUserDAO userDAO;
Run Code Online (Sandbox Code Playgroud)

但错误仍然存​​在.

两个问题:

  1. 如何通过基于注释的配置解决此问题?
  2. 如何在没有自动装配和注释的情况下运行测试?

iwe*_*ein 2

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

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

有很多方法可以解决这个问题,但最干净的是,您将只使用一个 bean 来实现您想要履行的合同。如果您确实需要不同的实现,您应该为它们提供不同且更具描述性的名称:

<bean id="jpaUserRepository" class="..JpaUserRepository"/>
Run Code Online (Sandbox Code Playgroud)

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