---
# System prepended metadata

title: Test Unit de repository Avec Spring et H2
tags: [Spring Boot]

---

# 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`