Il est essentiel de vérifier que l'existant fonctionne sur votre poste.
-
Depuis votre terminal, executez la commande :
mvn spring:boot-run
- Vérifiez bien que vous lancez la commande depuis la racine du projet.
Vous devriez avoir le message ci-dessous dans le terminal:
... superhero.SuperHeroApplication : Started SuperHeroApplication in 8.19 seconds (JVM running for 8.888)
- Depuis votre navigateur, allez à l'addresse:
http://localhost:8080/
Vous devez avoir une page comme ci-dessous:
Au démarrage, nous initialisons la table des super héros grâce à liquibase.
Nous utilisons H2 pour la persistance ( éphémère) des données en mémoire.
-
Vérifiez que les données initiales ont bien été chargées:
-
Vérifiez bien que la valeur du champ JDBC URL. Elle doit être égale à: jdbc:h2:mem:super-hero-app
-
Tout marche bien ? Chouette ! Tous les tests sont-ils au vert ?
-
Depuis votre terminal, executez la commande :
mvn clean test
- Vérifiez bien que vous lancez la commande depuis la racine du projet.
Vous devriez avoir le message ci-dessous dans le terminal:
...
[INFO] Results:
[INFO]
[INFO] Tests run: 25, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
...
Si vous choisissez de lancer les tests depuis votre IDE ( clic droit > run all tests), vous verrez la barre verte \o/
Avec votre équipe métier, vous avez défini vos endpoints. Il vous faut désormais les implementer !
Pour rappel, vous avez défini les choix suivant :
Tout vos services seront exposé en V1 sur /api/v1
/super-heros
:GET
: Liste tous les super héros dans la base de donnéesPOST
: Créé un super héros
/super-heros/{uuid}
GET
: Récupère un super hérosPUT
: Met à jour un super héros
/missions
:GET
: Liste toutes les missionsPOST
: Créé une nouvelle mission (une mission doit être rattaché à un super heros)
/missions/{uuid}
GET
: Récupére une mission
/missions/{uuid}/history-events
GET
: Liste l'historique des événements d'une missionPOST
: Rajoute une nouvelle évènement dans l'historique d'une mission
Pour cette partie, nous utiliserons Spring Web MVC mais, vous pouvez utiliser Apache CXF si vous êtes plus à l'aise. Spring Web MVC est déjà reférencée dans ce projet.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Afin de pouvoir sérialiser et désérialiser vos POJOS, vous aurez besoin d'un provider implémentant JAX-RS (JSR-331).
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
</dependency>
Qui dit implémentation dit Tests car le Test est votre premier client/ consommateur d'API.
Nous avons choisi restAssured pour l'implémentation des tests. Et comme nous avions opté pour du Spring MVC, nous pouvons directement utiliser RestAssured pour Spring Mock MVC.
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>spring-mock-mvc</artifactId>
<scope>test</scope>
</dependency>
Créer les endpoints défini lors du TP1 dans 2 classes :
SuperHeroApi
MissionApi
Penser bien à annoter vos classes & vos méthodes des annotations suivantes :
@GetMapping
@PostMapping
- Et surtout ...
@RestController
du packageorg.springframework.web.bind.annotation.*
au dessus de la classe;
Voici un petit exemple de test qui vérifie vérifie qu'une API renvoie HTTP 200 lorsque l'adresse /api/v1//super-heroes/
est implémentée.
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class SuperHeroApiShould {
@LocalServerPort
private int port;
protected RequestSpecification given() {
return RestAssured.given()
.port(port)
.basePath("/api/v1/");
}
@Test
void respond_with_a_200_status_when_getting_all_the_super_heroes_endpoint_exists() {
this.given()
.when()
.get("/super-heroes/")
.then()
.assertThat()
.statusCode(HttpStatus.OK.value());
}
}
Le test est vert ? On peut passer en test du code de production !!!
Votre test est vert? Félicitations, vous pouvez être sûrs/sûres que votre API répond.
Commencez par déployer votre application via spring boot: mvn spring-boot:run
Puis LE test!
- Pour les plus pressés :
curl localhost:8080/api/v1/super-heroes/
- Sinon, faire le même test avec Postman ( pour la posterité ou portabilité c'est selon :) !
Spring boot nous permet de monitorer des API très simplement via "actuator". Cette dépendance est déjà présente dans ce projet:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- Modifier la valeur de la proprieté :
management.endpoints.web.exposure.include
deapplication.yaml
tel que:
management.endpoints.web.exposure.include: '*'
- Dans la "vraie vie", il est très dangereux d'exposer tous les endpoints de l'actuator. Gros risques de sécurité. L'astérisque ici est pour les besoins de la formation.
-
Health check : http://localhost:8080/actuator/health
-
Changement liquibase: http://localhost:8080/actuator/liquibase
-
Curieux du reste ? Voir la documentation officielle de Spring boot.