Test autonome à l'aide d'une base de données en mémoire

1. Vue d'ensemble

Dans ce didacticiel, nous allons créer une application Spring simple qui s'appuie sur une base de données en mémoire pour les tests .

Pour le profil standard, l'application aura une configuration de base de données MySQL autonome, qui nécessite l'installation et l'exécution du serveur MySQL, avec un utilisateur et une base de données appropriés.

Pour faciliter le test de l'application, nous renoncerons à la configuration supplémentaire requise par MySQL et utiliserons à la place une base de données en mémoire H2 pour exécuter les tests JUnit.

2. Dépendances de Maven

Pour le développement, nous avons besoin des dépendances suivantes:

 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 

Les dernières versions de spring-test, spring-data-jpa, h2 et hibernate-core peuvent être téléchargées depuis Maven Central.

3. Modèle de données et référentiel

Créons une classe Student simple qui sera marquée comme une entité:

@Entity public class Student { @Id private long id; private String name; // standard constructor, getters, setters }

Ensuite, créons une interface de référentiel basée sur Spring Data JPA:

public interface StudentRepository extends JpaRepository { }

Cela permettra à Spring de créer la prise en charge de la manipulation des objets Student .

4. Sources de propriété distinctes

Pour permettre l'utilisation de différentes configurations de base de données pour le mode standard et le mode test, on peut lire les propriétés de la base de données à partir d'un fichier dont l'emplacement est différent selon le mode d'exécution de l'application.

Pour le mode normal, le fichier de propriétés résidera dans les ressources / src / main , et la méthode d'essai, nous allons utiliser un fichier de propriétés dans le répertoire src / test / ressources dossier .

Lors de l'exécution d'un test, l'application recherchera d'abord les fichiers dans le dossier src / test / resources . Si le fichier n'est pas trouvé à cet emplacement, il utilisera celui défini dans le dossier src / main / resources . Si le fichier est présent dans le chemin de test , il remplacera celui du chemin principal .

4.1. Définition des fichiers de propriétés

Créons un fichier persistence-student.properties dans le dossier src / main / resources qui définit les propriétés d'une source de données 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

Dans le cas de la configuration ci-dessus, nous aurons besoin de créer la base de données myDb et de configurer l'utilisateur tutorialuser / tutorialpass .

Puisque nous voulons utiliser une base de données en mémoire pour les tests, nous allons créer un fichier similaire avec le même nom dans le dossier src / test / resources , contenant des propriétés avec les mêmes clés et des valeurs spécifiques à la base de données 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

Nous avons configuré la base de données H2 pour qu'elle vive en mémoire et qu'elle soit créée automatiquement, puis fermée et supprimée lorsque la JVM se termine.

4.2. Configuration JPA

Créons une classe @Configuration qui recherche un fichier appelé persistence-student.properties en tant que source de propriété et crée une DataSource en utilisant les propriétés de base de données qui y sont définies:

@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. Création d'un test JUnit

Écrivons un test JUnit simple basé sur la configuration décrite ci-dessus qui utilise le StudentRepository pour enregistrer et récupérer une entité 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()); } }

Notre test se déroulera de manière entièrement autonome - il créera une base de données H2 en mémoire , exécutera des instructions, puis fermera la connexion et supprimera la base de données, comme nous pouvons le voir dans le journal:

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

Dans cet exemple rapide, nous avons montré comment nous pouvons exécuter un test autonome à l'aide d'une base de données en mémoire.

Comme toujours, le code source complet peut être trouvé sur GitHub.