簡體   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