我在spring上下文文件'applicationContext.xml'中定义了一个bean,如下所示:
<bean id="daoBean" class="org.mockito.Mockito" factory-method="mock">
<constructor-arg value="com.xxx.DAOImpl" />
</bean>
在我的服务类(ServiceImpl)中,我使用的bean如下所示:
@Component("serviceImpl")
public class ServiceImpl{
// other code here
@Autowired
private transient DAOImpl daoBean;
// other code here
}
我的JUnit测试类正在访问我的服务类。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/applicationContext.xml" })
public class JUnitTest{
// other code here
@Autowired
private transient ServiceImpl serviceImpl;
// test cases are here
}
当我执行测试用例时,它会出错:
创建名为'ServiceImpl'的bean时出错:注入自动连接的依赖项失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private transient com.xxx.DAOImpl
当我从服务类中删除@Autowired并使用@Resource(name =“daoBean”)时,测试用例工作正常。
public class ServiceImpl{
// other code here
@Resource(name = "daoBean")
private transient DAOImpl daoBean;
// other code here
}
我的问题是@Autowired在这种情况下不起作用的原因?我是否需要使用@Autowired配置任何其他内容,以便它可以正常工作。我不想更改我的服务层类来将@Autowired替换为@Resource。
答案 0 :(得分:3)
Mockito.mock()
有一个泛型返回类型T
,它在运行时被删除,因此Spring无法推断在Spring上下文中简单注册为Object
的创建模拟的类型。这就是@Autowired
不起作用的原因(因为它试图按类型查找依赖关系)。
查看this answer以获取问题的解决方案。