@Autowired不使用应用程序上下文文件中定义的bean

时间:2013-05-15 11:25:37

标签: java spring autowired

我在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。

1 个答案:

答案 0 :(得分:3)

Mockito.mock()有一个泛型返回类型T,它在运行时被删除,因此Spring无法推断在Spring上下文中简单注册为Object的创建模拟的类型。这就是@Autowired不起作用的原因(因为它试图按类型查找依赖关系)。

查看this answer以获取问题的解决方案。