Zelfstandig testen met behulp van een in-memory database

1. Overzicht

In deze tutorial gaan we dat doen maak een eenvoudige Spring-applicatie die voor het testen afhankelijk is van een in-memory database.

Voor het standaardprofiel heeft de applicatie een zelfstandige MySQL-databaseconfiguratie, waarvoor de MySQL-server is geïnstalleerd en actief moet zijn, met een juiste gebruiker en database.

Om het testen van de applicatie gemakkelijker te maken, zullen we afzien van de aanvullende configuratie die MySQL vereist en in plaats daarvan een H2 in-memory database voor het uitvoeren van de JUnit-tests.

2. Maven afhankelijkheden

Voor ontwikkeling hebben we de volgende afhankelijkheden nodig:

 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 nieuwste versies van spring-test, spring-data-jpa, h2 en hibernate-core kunnen worden gedownload van Maven Central.

3. Gegevensmodel en opslagplaats

Laten we een eenvoudig maken Leerling klasse die wordt gemarkeerd als een entiteit:

@Entity openbare klas Student {@Id lange privé-id; private String naam; // standard constructor, getters, setters}

Laten we vervolgens een repository-interface maken op basis van Spring Data JPA:

openbare interface StudentRepository breidt JpaRepository {} uit

Hierdoor kan Spring draagvlak creëren voor manipulatie Leerling voorwerpen.

4. Afzonderlijke eigendomsbronnen

Om het gebruik van verschillende databaseconfiguraties voor standaardmodus en testmodus mogelijk te maken, kunnen we de database-eigenschappen lezen uit een bestand waarvan de locatie verschilt afhankelijk van de actieve modus van de applicatie.

Voor de normale modus bevindt het eigenschappenbestand zich in src / main / resources, en voor de testmethode gebruiken we een eigenschappenbestand in het src / test / resources map.

Bij het uitvoeren van een test zoekt de applicatie eerst naar bestanden in het src / test / resources map. Als het bestand niet op deze locatie wordt gevonden, wordt het bestand gebruikt dat is gedefinieerd in src / main / resources map. Als het bestand aanwezig is, is het test pad, dan zal het die van het hoofd pad.

4.1. De eigenschappenbestanden definiëren

Laten we een persistence-student.properties bestand in het src / main / resources map die eigenschappen definieert voor een MySQL-gegevensbron:

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

In het geval van de bovenstaande configuratie, hebben we de myDb database gemaakt en de tutorialuser / tutorialpass gebruiker ingesteld.

Omdat we een in-memory database willen gebruiken om te testen, zullen we een soortgelijk bestand maken met dezelfde naam in het src / test / resources map, met eigenschappen met dezelfde sleutels en H2 database-specifieke waarden:

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

We hebben het H2 database om in het geheugen te leven en automatisch te worden gemaakt, en vervolgens te sluiten en te verwijderen wanneer de JVM wordt afgesloten.

4.2. JPA-configuratie

Laten we een @Configuratie klasse die zoekt naar een bestand met de naam persistence-student.properties als een eigenschapsbron en maakt een Databron met behulp van de database-eigenschappen die erin zijn gedefinieerd:

@Configuration @EnableJpaRepositories (basePackages = "com.baeldung.persistence.dao") @PropertySource ("persistence-student.properties") @EnableTransactionManagement openbare klasse StudentJpaConfig {@Autowired private Environment env; @Bean openbare DataSource dataSource () {DriverManagerDataSource dataSource = nieuwe 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")); retourneer dataSource; } // configureer entityManagerFactory // configureer transactionManager // configureer aanvullende slaapstand-eigenschappen}

5. Een JUnit-test maken

Laten we een eenvoudige JUnit-test schrijven op basis van de hierboven beschreven configuratie die de StudentRepository om een Leerling entiteit:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration (classes = {StudentJpaConfig.class}, loader = AnnotationConfigContextLoader.class) @Transactional openbare klasse InMemoryDBTest {@Resource private StudentRepository studentRepository; @Test openbare leegte gegevenStudent_whenSave_thenGetOk () {Student student = nieuwe student (1, "john"); studentRepository.save (student); Student student2 = studentRepository.findOne (1); assertEquals ("john", student2.getName ()); }}

Onze test zal volledig zelfstandig verlopen - het zal een in-memory creëren H2 database, voer instructies uit, sluit vervolgens de verbinding en verwijder de database, zoals we kunnen zien in het logboek:

INFO: HHH000400: dialect gebruiken: org.hibernate.dialect.H2Dialect Slaapstand: tabel laten vallen Student indien aanwezig Slaapstand: tabel maken Student (id bigint niet null, naam varchar (255), primaire sleutel (id)) 24 maart 2017 12: 41:51 org.hibernate.tool.schema.internal.SchemaCreatorImpl applyImportSources INFO: HHH000476: Uitvoeren van importscript 'org.hiber [email protected] 1b8f9e2' Slaapstand: selecteer student0_.id als id1_0_0_, student0_.n_ame als naam2_0_0_ waar student0_.id =? Hibernate: drop table Student indien aanwezig

6. Conclusie

In dit korte voorbeeld hebben we laten zien hoe we een op zichzelf staande test kunnen uitvoeren met behulp van een in-memory database.

Zoals altijd is de volledige broncode te vinden op GitHub.