Spring Data JPA. JUnit тесты для Services. Часть 3 – Devcolibri

Spring Data JPA. JUnit тесты для Services. Часть 3

← Spring Data JPA. Пишем DAO и Services. Часть 2
→ Spring Data JPA. JUnit тесты для Services. Часть 3

В этом уроке мы напишем интеграционные тесты для проверки наших сервисов с помощью JUnit. Довольно часто это требуется чтобы протестировать Service слой, именно это мы и будем делать.

О том что такое JUnit и для чего он можно почитать тут.

Тестировать мы будем только сервис BankService так как остальные тестируется сервисы тестируются аналогичным способом.

Также целью этого урока не является как можно правильней и лучше протестировать данный сервис, а то, как проверить работоспособность сервиса и сконфигурировать Spring Context для тестирования Spring компонентов.

Шаг 0. Зависимости

Обратите внимание, что в первой части этой серии мы подключали две зависимости:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>${junit.version}</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>${spring.test}</version>
    <scope>test</scope>
</dependency>

Первая зависимость это JUnit Framework для тестирования, вторая это поддержка Spring для тестирования.

Профессия Android разработчика Думаете, с какой профессией связать свою жизнь? Сделайте несколько шагов в сторону мобильной разработки бесплатно, а затем со скидкой 50% пройдите этот путь до конца.

Шаг 1. Конфигурирование Spring

Теперь нам нужно сконфигурировать Spring для тестов это можно сделать используя туже конфигурацию что и в первом уроке.

Разница между ними будет только в том что DataSource будет сконфигурирован под тестовую БД – testdb.

package com.devcolibri.dataexam.test.config;

import org.hibernate.ejb.HibernatePersistence;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;
import java.util.Properties;

@Configuration
@EnableTransactionManagement
@ComponentScan("com.devcolibri.dataexam")
public class TestDataBaseConfig {

    private static final String PROPERTY_NAME_DATABASE_DRIVER = "com.mysql.jdbc.Driver";
    private static final String PROPERTY_NAME_DATABASE_URL = "jdbc:mysql://localhost:3306/testdb";
    private static final String PROPERTY_NAME_DATABASE_USERNAME = "root";
    private static final String PROPERTY_NAME_DATABASE_PASSWORD = "root";

    private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "org.hibernate.dialect.MySQLDialect";
    private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "true";
    private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN = "com.devcolibri.dataexam.entity";
    private static final String PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO = "create-drop";

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(dataSource());
        entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistence.class);
        entityManagerFactoryBean.setPackagesToScan(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN);

        entityManagerFactoryBean.setJpaProperties(hibernateProp());

        return entityManagerFactoryBean;
    }

    @Bean
    public JpaTransactionManager transactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());

        return transactionManager;
    }

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();

        dataSource.setDriverClassName(PROPERTY_NAME_DATABASE_DRIVER);
        dataSource.setUrl(PROPERTY_NAME_DATABASE_URL);
        dataSource.setUsername(PROPERTY_NAME_DATABASE_USERNAME);
        dataSource.setPassword(PROPERTY_NAME_DATABASE_PASSWORD);

        return dataSource;
    }

    private Properties hibernateProp() {
        Properties properties = new Properties();
        properties.put("hibernate.dialect",	PROPERTY_NAME_HIBERNATE_DIALECT);
        properties.put("hibernate.show_sql", PROPERTY_NAME_HIBERNATE_SHOW_SQL);
        properties.put("hibernate.hbm2ddl.auto", PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO);
        return properties;
    }

}

Не будем углубляться в подробности, так как все это было рассмотрено в первой части, мы то же самое модифицировали под нашу тестовую БД. Данная конфигурация будет отвечать за наш контекст и все beans которые мы в нем сконфигурировали, будут созданы после того как контекст запустится.

Профессия Android разработчика Думаете, с какой профессией связать свою жизнь? Сделайте несколько шагов в сторону мобильной разработки бесплатно, а затем со скидкой 50% пройдите этот путь до конца.

Шаг 2. Создание тестового класса

Давайте создадим тестовый класс со всеми аннотациями и ниже их рассмотрим:

package com.devcolibri.dataexam.test.service;

import com.devcolibri.dataexam.service.BankService;
import com.devcolibri.dataexam.test.config.TestDataBaseConfig;
import com.devcolibri.dataexam.test.util.BankUtil;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;

import javax.annotation.Resource;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

@DirtiesContext
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestDataBaseConfig.class)
@WebAppConfiguration
public class BankServiceTest {

    @Resource
    private EntityManagerFactory emf;
    protected EntityManager em;

    @Resource
    private BankService bankService;

    @Before
    public void setUp() throws Exception {
        em = emf.createEntityManager();
    }

    @Test
    public void testSaveBank() throws Exception {
        bankService.addBank(BankUtil.createBank());
    }
}

Аннотации:

@DirtiesContext – говорит что ApplicationContext Spring будет связан с тестовым классом;

@RunWith(SpringJUnit4ClassRunner.class) – говорит JUnit-у что для запуска тестов нужно использовать спринговый ранер;

@ContextConfiguration(classes = TestDataBaseConfig.class) – с помощью этой аннотации мы указываем какую конфигурацию контекста использовать, можно указывать несколько. Обратите внимание что мы указали конфигурацию, которую создали в первом шаге.

@WebAppConfiguration – используется для тестирования контроллеров например, чтобы иметь доступ к веб-ресурсам.

Для удобства и не обязательно:

Ну и на завершение был создан утильный класс, который бы создавал нужные нам экземпляры объектов:

package com.devcolibri.dataexam.test.util;

import com.devcolibri.dataexam.entity.Bank;

public class BankUtil {

    public static Bank createBank() {
        Bank bank = new Bank();
        bank.setName("Gold Bank");

        return bank;
    }

}

← Spring Data JPA. Пишем DAO и Services. Часть 2
→ Spring Data JPA. JUnit тесты для Services. Часть 3

Также читайте: «Быстрый старт в Spring Security» и «Unit тестирование с JUnit»

ПОХОЖИЕ ПУБЛИКАЦИИ

36462
24/07/2014

13 комментариев к статье "Spring Data JPA. JUnit тесты для Services. Часть 3"

  1. Во-первых спасибо.
    Опечатки мелкие в статье есть, вот те что увидел “испоьзуя”, “нимим”.
    IDEA пишет, что HibernatePersistance устарел – в stackoverflow посоветовали использовать HibernatePersistanceProvider
    http://stackoverflow.com/questions/21871283/spring-data-jpa-java-config-hibernatepersistence-class

  2. Очень помогает Ваш сайт разобраться со Спрингом. А следующая часть будет? А то я сам пробовал добавтить MVC но что то не вышло его с Spring-Data соеденить. Я так понял какято не совместимость с версиями.

  3. Отлично! Спасибо! Скачал и легко открыл проект в Эклипс и переделал на работу с Постгрес. Начинаю использовать рассмотренные технологии в новом проекте!

  4. Добрый вечер.Я повторил все шаги и ошибок нет, но как теперь запустить, чтобы проверить??

  5. Добрый вечер. Я повторил шаги и ошибок пока IDEA не нашла, но как запустить это приложение???

  6. Запускаю тест и ловлю этот эксепш:
    java.lang.IllegalStateException: Could not load TestContextBootstrapper [null]. Specify @BootstrapWith’s ‘value’ attribute or make the default bootstrapper class available.

Добавить комментарий

Сайт использует cookie-файлы для того, чтобы вам было удобнее им пользоваться. Для продолжения работы с сайтом, вам необходимо принять использование cookie-файлов.

Я ознакомлен(а)