# Test Unit de repository Avec Spring et H2 ## Installation - Ajouter la dependance H2 Database dans pom.xml - Ajouter un nouveau fichier `application-test.properties` dans le dossier `resources` - Dans ce fichier coller : ``` spring.datasource.driver-class-name=org.h2.Driver spring.datasource.url=jdbc:h2:mem:testDatabase spring.datasource.username=sa spring.datasource.password= spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect ``` - Ajouter votre fichier d'initialisation de database (.sql) dans le dossier `resources`. Vous pouver Inserer des elements si besoin pour les tests. ## Initialisation de la datasource - Dans votre repository à tester, ajouter un getter/setter de l'attribut `datasource` ``` public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public DataSource getDataSource() { return dataSource; } ``` - taper maj+ctrl+p puis `Go to test` puis `generate test` et ajouter les methodes a tester - - Ajouter ce code en remplaçant `trackRepositoy` par votre repository à tester et`mySqlFile.sql` par votre fichier SQL de test du dossier resources ``` public class repositoryTest { TrackRepository trackRepository; @BeforeEach void init() { trackRepository = new TrackRepository(); DataSource dataSource = new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.H2) .addScript("mySqlFile.sql") .build(); trackRepository.setDataSource(dataSource); } ``` #### Pour détailler ce code : - On declare notre repository en attribut de la classe test - on instancie le repository avant chaque test - on instancie une datasource virtuelle grace à H2 avec notre fichier SQL de test - on inject cette datasource dans le repository - <strong> !!! Si vous avez des repository qui font appellent d'autre repository il faut instancier tous les repository dans le test et injecter la datasource dans tous les repository utilisés !!! </strong> ## effectuer les tests Vous pouvez ensuite tester vos methodes avec les methodes basiques de Junit (assertEquals, assertTrue, assertNotNull,...) exemple (si les methodes update, save et delete return un boolean, methode Jean) : ``` @Test void testFindById() { assertNotNull(trackRepository.findById(1)); } ``` ``` @Test void testDeleteTrack() { assertTrue(trackRepository.deleteById(1)); } ``` ``` @Test void testSaveTrack() { Track track = new Track("name", "url"); assertTrue(trackRepository.save(track)); assertNotNull(track.getId()); } ``` ``` @Test void testFindAll() { assertNotEquals(0, trackRepository.findAll().size()); } ``` Si l'objet avec id 1 existe déjà dans la database : ``` @Test void testupdateTrack() { Track track = new Track("name", "url"); track.setId(1); assertTrue(trackRepository.update(track)); } ``` ### Bons tests :+1: ###### tags: `Spring Boot`