Самостоятелно тестване с помощта на база данни в паметта

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. Модел на данни и хранилище

Нека създадем прост студентски клас, който ще бъде маркиран като обект:

@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 / основни / ресурси , както и при метода за изпитване, ние ще използваме файл имоти в SRC / тест / ресурси папката .

Когато изпълнява тест, приложението първо ще търси файлове в папката src / test / resources . Ако файлът не е намерен на това място, той ще използва този, дефиниран в папката src / main / resources . Ако файлът присъства, това е тестовият път, той ще замени този от основния път.

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

В случая с горната конфигурация ще трябва да създадем базата данни myDb и да настроим потребителя на tutorialuser / tutorialpass .

Тъй като искаме да използваме база данни в паметта за тестване, ще създадем подобен файл със същото име в папката 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 като източник на свойство, и създава DataSource, използвайки свойствата на базата данни, дефинирани в него:

@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.