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)
但错误仍然存在.
两个问题:
您正在使用没有名称的 bean,以便 Spring 会尝试提供一个名称,该名称可能基于您在类上可能具有的 @Component 注释,但它也可能是您的非限定类的驼峰版本你的 bean 的名称(在这两种情况下,它们都会相等,这会导致 Spring 反对)。
另外,您似乎正在以一种对我来说有点奇怪的方式混合组件扫描和 xml 配置。
有很多方法可以解决这个问题,但最干净的是,您将只使用一个 bean 来实现您想要履行的合同。如果您确实需要不同的实现,您应该为它们提供不同且更具描述性的名称:
<bean id="jpaUserRepository" class="..JpaUserRepository"/>
Run Code Online (Sandbox Code Playgroud)
这将为您提供更有用的日志记录,即使从未使用过 bean 名称,因为您依赖于自动连接。
| 归档时间: |
|
| 查看次数: |
4267 次 |
| 最近记录: |