繁体   English   中英

用@Autowired嘲笑春天jdbctemplate

[英]issue mocking spring jdbctemplate with @Autowired

我将模仿作为模拟对象库。 我正在对DAO进行单元测试。

DAO希望通过@Autowired注入JdbcTemplate。 因此,在DAO中没有用于单元测试可以调用的JDBC模板的setter方法。

我有以下测试spring应用程序上下文:

<b:beans 
    xmlns:b="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-3.0.xsd
         http://www.springframework.org/schema/util
         http://www.springframework.org/schema/util/spring-util-3.0.xsd">

    <context:annotation-config />

    <b:bean id="mockito" class="org.mockito.Mockito" />
    <b:bean 
        id="mockJdbcTemplate"
        factory-bean="mockito"
        factory-method="mock">
        <b:constructor-arg value="org.springframework.jdbc.core.JdbcTemplate"/>
    </b:bean>
</b:beans>

我期望在测试执行时,sp​​ring将创建模拟jdbctemplate实例并将其自动连接到DAO。

但这并没有发生-相反,我得到以下异常:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [org.springframework.jdbc.core.JdbcTemplate] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:920)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:789)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:474)
    ... 42 more

以前有人用这种方法成功吗?

谢谢。

我认为问题在于返回通用类型的工厂方法mock 擦除后,spring无法扣除对象类型,请尝试通过class属性提供显式的对象类型。

public MockitoMockFactoryBean implements FactoryBean<?>
{
    private Class<?> objectType;

    @Override public Object getObject()
    {
        return Mockito.mock(objectType);
    }
    public void setObjectType(Class<?> objectType)
    {
        this.objectType=objectType;
    }
    @Override public Class<?> getObjectType()
    {
        return objectType;
    }
}

还有其他一些技术可以帮助您解决测试问题:

使用您的真实数据库:

Spring Framework对Testing的支持使您可以在设置过程中启动事务,并在拆解中回滚事务,因此数据库中不会堆积测试数据。 对于复杂的设置, DBUnit可以帮助您。 如您所指出的,这比单元测试花费的时间更长。 这就是为什么开发人员经常将集成测试分为一个单独的套件,该套件作为构建步骤而不是开发人员构建的一部分运行。

使用MockRunner:

MockRunner是一个用于创建伪造的JDBC组件的库,您可以在其中填充结果集数据,而JdbcTemplate不知道它们之间的区别。 我不确定您是否可以仅使用Spring创建MockDataSource而无需编写一些帮助程序类

在不使用Spring接线的测试中使用Mockito:

Mockito最适合用于单元测试。 因此,您的DAO测试不会使用Spring进行连接,您将创建一个单元测试,在其中创建手动注入到DAO中的模拟JdbcTemplate。

如果您要尝试测试的不仅仅是DAO,而且要查看几个组件如何组合成一个真正的集成测试,那么模拟数据库将隐藏您的真实数据库中出现的实际问题。 如果您只是想让单个DAO在JdbcTemplates的模拟输出中正常运行,那么使用Mockito或MockRunner将允许您这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM