2

我在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:无法自动装配字段:私有瞬态 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。

4

1 回答 1

3

Mockito.mock()有一个T在运行时被擦除的通用返回类型,因此 Spring 无法推断创建的模拟的类型,它将被简单地注册为ObjectSpring 上下文中。这就是为什么@Autowired不起作用(因为它试图按其类型查找依赖项)。

查看此答案以获取问题的解决方案。

于 2013-05-15T11:45:16.163 回答