видавати висміюючу весну jdbctemplate з @Autowired

Я використовую mockito як бібліотеку макетів об'єктів. Я підрозділ тестування DAOs.

DAOs очікують, що JdbcTemplate буде введено через @Autowired. Отже, у методах встановлення для шаблону JDBC у DAO немає способів виклику модульних тестів.

У мене є наступний контекст застосування тесту весни:



    

    
    
        
    

Я очікував, що під час виконання тесту навесні буде створено шаблон 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

Хто-небудь мав успіх з таким підходом раніше?

Дякую.

1
У нас є окремий проект для шару DAO, і це єдиний проект із охопленням 0% коду, оскільки ми пропустили тести для DAO для друку, оскільки більшість органів методу є одним вкладишем (цей.jdbcTemplate.query або update) - але під час зовнішній аудит, цей (без перевірки охоплення) було вибрано, і тому я пишу одиничні тести, щоб позначити прапорці ...
додано Автор tapasvi, джерело
Я не можу використовувати вбудовану базу даних з різних причин (відсутність підтримки синтаксису запитів у Sybase ASE) .. тестування з вбудованою базою даних не буде тестом true ... Використання автономної тестової бази даних уповільнює виконання тесту ... і у нас є 7 розробників і один CI-сервер ... так що тести не виконуватимуться окремо ...
додано Автор tapasvi, джерело
Це насправді не стосується DAO ... це весняне технічне питання: як ви автоматично монтуєте та вводите нерухомість з об'єктом, що повертається фабрикою екіпажу?
додано Автор tapasvi, джерело
Я не бачу точки знущання над JdbcTemplate. Яка точка тестування DAO, висміюючи JdbcTemplate? Що буде ваш тестовий тест?
додано Автор JB Nizet, джерело
Так що фактично тести не випробовують нічого взагалі, а просто використовуються для штучного збільшення охоплення. Вибачте, але це дійсно дурень. Ви також можете використовувати справжній JdbcTemplate і зловити і ігнорувати будь-які винятки у вашому тесті.
додано Автор JB Nizet, джерело
Я думаю, що цей проект DAO повинен використовувати інтеграційні тести, а не тести на одиницю. Тому необхідно створити тестову базу даних та перевірити, чи DAO-методи дають правильні результати. Також подивіться на DbUnit.
додано Автор kan, джерело

2 Відповіді

Я думаю, проблема полягає в тому, що заводський метод mock , який повертає загальний тип. Після стирання джерело не може вирахувати тип об'єкта, намагатись надавати явний тип об'єкта за атрибутом 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;
    }
}
0
додано
Привіт Кан: Я намагався вказати атрибут класу - не працював (хоча і не було додаткових помилок).
додано Автор tapasvi, джерело
Я можу підтвердити цей підхід FactoryBean.
додано Автор tapasvi, джерело
О, праворуч Якщо присутній атрибут "фабричний квадрат", атрибут "class" не використовується . Потім я не бачу жодного вибору, крім створення реалізації FactoryBean , який поверне правильний тип об'єкта за допомогою методу getObjectType .
додано Автор kan, джерело

Існує кілька інших методів, які можуть допомогти у вирішенні проблем тестування.

Використання вашої реальної бази даних:

Підтримка Spring Framework для Тестування дозволяє вам щоб розпочати транзакції під час налаштування, а також відкотити їх назад у розрив, тому база даних не завалена тестовими даними. Для складної настройки DBUnit може допомогти в цьому. Як зазначалося, це триває довше, ніж одиничні тести. Тому розробники часто відокремлюють інтеграційні тести в окремий пакет, який запускається як крок побудови, а не частина розробки розробника.

Використання MockRunner:

MockRunner це бібліотека для створення підроблених компонентів JDBC, де ви заповнюєте дані набору результатів, а JdbcTemplate не знає різниці. Я не впевнений, що ви можете створити MockDataSource, використовуючи тільки Spring, не написавши деякі класні помічники

Використання Mockito всередині тесту без підключення Spring:

Mockito найкраще використовується для тестування пристроїв. Таким чином, ваші тести DAO не були б з'єднані за допомогою Spring, ви створили б тестування пристрою, де ви створюєте знущається JdbcTemplate, яку ви вручну вводите в свій DAO.

Якщо ви намагаєтеся випробувати більше, ніж просто DAO індивідуально, і хочете побачити, як декілька компонентів об'єднуються в реальний інтеграційний тест, тоді знущання з бази даних призведе до приховування реальних проблем, які з'являються у вашій реальній базі даних. Якщо ви просто дбаєте про те, що ваші особисті DAO поводяться належним чином з макетом виводу з JdbcTemplates, то використання Mockito або MockRunner дозволить вам це зробити.

0
додано
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників