Selvinntatt testing ved hjelp av en minnedatabase

1. Oversikt

I denne opplæringen skal vi lage en enkel Spring-applikasjon som er avhengig av en database i minnet for testing.

For standardprofilen vil applikasjonen ha en frittstående MySQL-databasekonfigurasjon, som krever at MySQL-serveren er installert og kjørt, med riktig bruker og database satt opp.

For å gjøre testing av applikasjonen enklere, vil vi gi avkall på den ekstra konfigurasjonen som kreves av MySQL, og i stedet bruke en H2 database i minnet for å kjøre JUnit-testene.

2. Maven-avhengigheter

For utvikling trenger vi følgende avhengigheter:

 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 

De siste versjonene av vårtest, vårdata-jpa, h2 og dvalekjerne kan lastes ned fra Maven Central.

3. Datamodell og depot

La oss lage en enkel Student klasse som vil bli merket som en enhet:

@Entity public class Student {@Id privat lang id; privat strengnavn; // standard konstruktør, getters, setters}

La oss deretter opprette et lagringsgrensesnitt basert på Spring Data JPA:

offentlig grensesnitt StudentRepository utvider JpaRepository {}

Dette vil gjøre det mulig for våren å skape støtte for manipulering Student gjenstander.

4. Separate eiendomskilder

For å tillate bruk av forskjellige databasekonfigurasjoner for standardmodus og testmodus, kan vi lese databaseegenskapene fra en fil hvis beliggenhet er forskjellig avhengig av kjøremodus for applikasjonen.

I normal modus vil eiendomsfilen ligge i src / main / resources, og for testmetoden, vil vi bruke en egenskapsfil i src / test / ressurser mappe.

Når du kjører en test, vil applikasjonen først se etter filer i src / test / ressurser mappe. Hvis filen ikke finnes på dette stedet, vil den bruke den som er definert i src / main / resources mappe. Hvis filen er til stede, er den test sti, så vil den overstyre den fra hoved- sti.

4.1. Definere eiendomsfilene

La oss lage en utholdenhetsstudent.egenskaper filen i src / main / resources mappe som definerer egenskaper for en MySQL-datakilde:

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.hm .auto = create-drop

Når det gjelder konfigurasjonen ovenfor, må vi ha myDb database opprettet og tutorialuser / tutorialpass brukeroppsett.

Siden vi ønsker å bruke en database i minnet for testing, vil vi opprette en lignende fil med samme navn i src / test / ressurser mappe, som inneholder egenskaper med de samme tastene og H2 databasespesifikke verdier:

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

Vi har konfigurert H2 databasen for å leve i minnet og opprettes automatisk, og deretter lukkes og slippes når JVM går ut.

4.2. JPA-konfigurasjon

La oss lage en @Konfigurasjon klasse som søker etter en fil som heter utholdenhetsstudent.egenskaper som en eiendomskilde og skaper en Datakilde ved hjelp av databaseegenskapene som er definert i den:

@Configuration @EnableJpaRepositories (basePackages = "com.baeldung.persistence.dao") @PropertySource ("persistence-student.properties") @EnableTransactionManagement offentlig klasse 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")); returner datakilde; } // configure entityManagerFactory // configure transactionManager // configure additional Hibernate Properties}

5. Lage en JUnit-test

La oss skrive en enkel JUnit-test basert på konfigurasjonen beskrevet ovenfor som bruker StudentRepository for å lagre og hente en Student enhet:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (classes = {StudentJpaConfig.class}, loader = AnnotationConfigContextLoader.class) @ Transactional public class InMemoryDBTest {@Resource private StudentRepository studentRepository; @Test offentlig ugyldig givenStudent_whenSave_thenGetOk () {Student student = new Student (1, "john"); studentRepository.save (student); Student student2 = studentRepository.findOne (1); assertEquals ("john", student2.getName ()); }}

Testen vår kjører på en helt selvstendig måte - det vil skape et minne H2 database, utføre uttalelser, lukk deretter tilkoblingen og slipp databasen, som vi kan se i loggen:

INFO: HHH000400: Bruke dialekt: org.hibernate.dialect.H2Dialect Dvalemodus: drop tabell Student hvis eksisterer Dvalemodus: opprett tabell Student (id bigint ikke null, navn varchar (255), primærnøkkel (id)) 24. mars 2017 12: 41:51 org.hibernate.tool.schema.internal.SchemaCreatorImpl applyImportSources INFO: HHH000476: Utfører importskript 'org.hiber [email protected] 1b8f9e2' Dvalemodus: velg student0_.id som id1_0_0_, student0_.navn som navn2_0_ hvor student0_.id =? Dvalemodus: slipp tabell Student hvis det finnes

6. Konklusjon

I dette raske eksemplet har vi vist hvordan vi kan kjøre en selvstendig test ved hjelp av en database i minnet.

Som alltid kan hele kildekoden finnes på GitHub.