Selvindesluttet test ved hjælp af en hukommelsesdatabase

1. Oversigt

I denne vejledning skal vi Opret en simpel Spring-applikation, der er afhængig af en database i hukommelsen til test.

For standardprofilen vil applikationen have en enkeltstående MySQL-databasekonfiguration, som kræver, at MySQL-serveren er installeret og kører med en korrekt bruger og database opsat.

For at gøre det lettere at teste applikationen vil vi afstå fra den ekstra konfiguration, der kræves af MySQL, og i stedet bruge en H2 in-memory database til at køre JUnit-testene.

2. Maven-afhængigheder

Til udvikling har vi brug for følgende afhængigheder:

 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 nyeste versioner af spring-test, spring-data-jpa, h2 og hibernate-core kan downloades fra Maven Central.

3. Datamodel og lager

Lad os oprette en simpel Studerende klasse, der vil blive markeret som en enhed:

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

Lad os derefter oprette en lagergrænseflade baseret på Spring Data JPA:

offentlig grænseflade StudentRepository udvider JpaRepository {}

Dette vil gøre det muligt for foråret at skabe understøttelse til manipulation Studerende genstande.

4. Separate ejendomskilder

For at tillade brug af forskellige databasekonfigurationer til standardtilstand og testtilstand kan vi læse databaseegenskaberne fra en fil, hvis placering er forskellig afhængigt af applikationens kørselstilstand.

I normal tilstand ligger egenskabsfilen i src / main / ressourcer, og til testmetoden bruger vi en egenskabsfil i src / test / ressourcer folder.

Når du kører en test, søger applikationen først efter filer i src / test / ressourcer folder. Hvis filen ikke findes på denne placering, bruger den den, der er defineret i src / main / ressourcer folder. Hvis filen er til stede, er den prøve sti, så tilsidesætter den den fra vigtigste sti.

4.1. Definition af ejendomsfiler

Lad os oprette en vedholdenhedsstudent.egenskaber fil i src / main / ressourcer mappe, der definerer egenskaber 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 = Opret-slip

I tilfælde af ovenstående konfiguration skal vi have myDb database oprettet og tutorialuser / tutorialpass brugeropsætning.

Da vi vil bruge en in-memory database til test, opretter vi en lignende fil med samme navn i src / test / ressourcer mappe, der indeholder egenskaber med de samme nøgler og H2 databasespecifikke værdier:

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 konfigureret H2 database til at leve i hukommelsen og oprettes automatisk, derefter lukkes og droppes, når JVM'en afslutter.

4.2. JPA-konfiguration

Lad os oprette en @Konfiguration klasse, der søger efter en fil, der hedder vedholdenhedsstudent.egenskaber som en ejendomskilde og skaber en Datakilde ved hjælp af de databaseegenskaber, der er defineret i den:

@Configuration @EnableJpaRepositories (basePackages = "com.baeldung.persistence.dao") @PropertySource ("persistence-student.properties") @EnableTransactionManagement offentlig klasse StudentJpaConfig {@Autowired private Environment env; @Bean offentlig DataSource dataSource () {DriverManagerDataSource dataSource = ny 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")); returnere datakilde; } // configure entityManagerFactory // configure transactionManager // configure additional Hibernate Properties}

5. Oprettelse af en JUnit-test

Lad os skrive en simpel JUnit-test baseret på den ovenfor beskrevne konfiguration, der bruger Studenteropbevaring for at gemme og hente en Studerende enhed:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (classes = {StudentJpaConfig.class}, loader = AnnotationConfigContextLoader.class) @Transactional public class InMemoryDBTest {@Resource private StudentRepository studentRepository; @Test offentligt ugyldigt givenStudent_whenSave_thenGetOk () {Studentstudent = ny elev (1, "john"); studentRepository.save (studerende); Studerende student2 = studentRepository.findOne (1); assertEquals ("john", student2.getName ()); }}

Vores test kører på en helt selvstændig måde - det vil skabe en hukommelse H2 database, udfør udsagn, luk derefter forbindelsen og slip databasen, som vi kan se i loggen:

INFO: HHH000400: Brug af dialekt: org.hibernate.dialect.H2Dialect Dvaletilstand: drop-tabel Studerende, hvis der er dvale: Opret tabel Student (id bigint ikke null, navn varchar (255), primær nøgle (id)) 24. marts 2017 12: Kl. hvor student0_.id =? Dvaletilstand: drop-tabel Studerende, hvis der findes

6. Konklusion

I dette hurtige eksempel har vi vist, hvordan vi kan køre en selvstændig test ved hjælp af en database i hukommelsen.

Som altid kan den fulde kildekode findes på GitHub.