1. Обзор
В этом уроке мы собираемся создать простое приложение Spring, которое использует базу данных в памяти для тестирования .
Для стандартного профиля приложение будет иметь автономную конфигурацию базы данных MySQL, которая требует установки и запуска сервера MySQL с соответствующим пользователем и настройкой базы данных.
Чтобы упростить тестирование приложения, мы откажемся от дополнительной конфигурации, требуемой MySQL, и вместо этого будем использовать базу данных H2 в памяти для запуска тестов JUnit.
2. Зависимости Maven
Для разработки нам нужны следующие зависимости:
org.springframework spring-test 5.1.5.RELEASE org.springframework.data spring-data-jpa 2.1.5.RELEASE com.h2database h2 1.4.194 org.hibernate hibernate-core 5.2.17.Final
Последние версии spring-test , spring-data-jpa , h2 и hibernate-core можно загрузить с Maven Central.
3. Модель данных и хранилище
Давайте создадим простой класс Student , который будет помечен как объект:
@Entity public class Student { @Id private long id; private String name; // standard constructor, getters, setters }
Далее, давайте создадим интерфейс репозитория на основе Spring Data JPA:
public interface StudentRepository extends JpaRepository{ }
Это позволит Spring создать поддержку для манипулирования объектами Student .
4. Отдельные Источники Собственности
Чтобы разрешить использование различных конфигураций базы данных для стандартного режима и режима тестирования, мы можем прочитать свойства базы данных из файла, расположение которого отличается в зависимости от режима работы приложения.
В обычном режиме файл свойств будет находиться в src/main/resources , а для метода тестирования мы будем использовать файл свойств в папке src/test/resources /.
При запуске теста приложение сначала будет искать файлы в папке src/test/resources . Если файл не найден в этом расположении, он будет использовать файл, определенный в папке src/main/resources . Если файл присутствует в пути test , то он переопределит путь из main .
4.1. Определение файлов свойств
Давайте создадим файл persistence-student.properties в папке src/main/resources , который определяет свойства источника данных MySQL:
dbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/myDb jdbc.user=tutorialuser jdbc.pass=tutorialpass hibernate.dialect=org.hibernate.dialect.MySQL5Dialect hibernate.hbm2ddl.auto=create-drop
В случае приведенной выше конфигурации нам потребуется создать базу данных mdb и настроить пользователя tutorial/tutorial pass user.
Поскольку мы хотим использовать базу данных в памяти для тестирования, мы создадим аналогичный файл с тем же именем в папке src/test/resources , содержащий свойства с теми же ключами и H2 значениями для конкретной базы данных:
jdbc.driverClassName=org.h2.Driver jdbc.url=jdbc:h2:mem:myDb;DB_CLOSE_DELAY=-1 hibernate.dialect=org.hibernate.dialect.H2Dialect hibernate.hbm2ddl.auto=create
Мы настроили базу данных H2 так, чтобы она жила в памяти и создавалась автоматически, а затем закрывалась и удалялась при выходе из JVM.
4.2. Конфигурация JPA
Давайте создадим класс @Configuration , который ищет файл с именем persistence-student.properties в качестве источника свойств и создает Источник данных , используя свойства базы данных, определенные в нем:
@Configuration @EnableJpaRepositories(basePackages = "com.baeldung.persistence.dao") @PropertySource("persistence-student.properties") @EnableTransactionManagement public class StudentJpaConfig { @Autowired private Environment env; @Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName")); dataSource.setUrl(env.getProperty("jdbc.url")); dataSource.setUsername(env.getProperty("jdbc.user")); dataSource.setPassword(env.getProperty("jdbc.pass")); return dataSource; } // configure entityManagerFactory // configure transactionManager // configure additional Hibernate Properties }
5. Создание теста JUnit
Давайте напишем простой тест JUnit на основе конфигурации, описанной выше, который использует StudentRepository для сохранения и извлечения сущности Student :
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration( classes = { StudentJpaConfig.class }, loader = AnnotationConfigContextLoader.class) @Transactional public class InMemoryDBTest { @Resource private StudentRepository studentRepository; @Test public void givenStudent_whenSave_thenGetOk() { Student student = new Student(1, "john"); studentRepository.save(student); Student student2 = studentRepository.findOne(1); assertEquals("john", student2.getName()); } }
Наш тест будет выполняться полностью автономно -он создаст базу данных в памяти H2 , выполнит инструкции, затем закроет соединение и удалит базу данных, как мы видим в журнале:
INFO: HHH000400: Using dialect: org.hibernate.dialect.H2Dialect Hibernate: drop table Student if exists Hibernate: create table Student (id bigint not null, name varchar(255), primary key (id)) Mar 24, 2017 12:41:51 PM org.hibernate.tool.schema.internal.SchemaCreatorImpl applyImportSources INFO: HHH000476: Executing import script 'org.hiber[email protected]1b8f9e2' Hibernate: select student0_.id as id1_0_0_, student0_.name as name2_0_0_ from Student student0_ where student0_.id=? Hibernate: drop table Student if exists
6. Заключение
В этом кратком примере мы показали, как мы можем запустить автономный тест, используя базу данных в памяти.
Как всегда, полный исходный код можно найти на GitHub .