TP #1 - Configuration XML
Partie 1 - Prise en main Spring Core
Github
- Créer un fork du projet
sirh-gestion-paie
. - Importer le projet sur votre poste.
- Ouvrir STS (Spring Tools Suite).
- Importer le projet Maven
sirh-gestion-paie
.
Intégration du BOM Spring
Le projet Spring est constitué de nombreux sous-projets avec chacun son cycle de vie. Pour éviter d'utiliser deux sous-projets avec des versions incompatibles, le projet met à disposition un BOM (Bill Of Materials). Il s'agit d'une dépendance Maven spéciale à intégrer avec le scope import.
- Compléter le projet dans la section dependencyManagement avec :
<project ...>
<properties>
...
</properties>
<build>
...
</build>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>4.3.8.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
Intégration Spring Context
Le projet spring-context contient les outils permettant de créer le contexte Spring.
- Ajouter la dépendance vers spring-context :
<project ...>
...
<dependencyManagement>
...
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
</dependencies>
</project>
Classe PaieUtils
Dans le cadre de cette application, nous allons manipuler des types java.math.BigDecimal. Les nombres affichés auront toujours 2 chiffres après la virgule.
Centralisons cette logique dans une classe dev.paie.util.PaieUtils.
- Créer une classe dev.paie.util.PaieUtils avec le contenu suivant :
public class PaieUtils {
/**
* Formate un nombre sous la forme xx.xx (exemple : 2.00, 1.90). L'arrondi
* se fait en mode "UP" => 1.904 devient 1.91
*
* @param decimal nombre à formater
* @return le nombre formaté
*/
public String formaterBigDecimal(BigDecimal decimal) {
DecimalFormat df = new DecimalFormat();
// forcer le séparateur "." même sur un poste en français
df.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(Locale.UK));
df.setMaximumFractionDigits(2);
df.setRoundingMode(RoundingMode.UP);
df.setMinimumFractionDigits(2);
df.setGroupingUsed(false);
return df.format(decimal);
}
}
Nous allons à présent créer une classe de test unitaire pour valider le fonctionnement de la méthode formaterBigDecimal.
- Dans la partie src/test/java, créer une classe dev.paie.util.PaieUtilsTest avec le contenu suivant :
public class PaieUtilsTest {
private PaieUtils paieUtils;
@Before
public void onSetup() {
// code exécuté avant chaque test
}
@Test
public void test_formaterBigDecimal_entier_positif() {
String resultat = paieUtils.formaterBigDecimal(new BigDecimal("2"));
assertThat(resultat, equalTo("2.00"));
}
@Test
public void test_formaterBigDecimal_trois_chiffres_apres_la_virgule() {
String resultat = paieUtils.formaterBigDecimal(new BigDecimal("2.199"));
assertThat(resultat, equalTo("2.20"));
}
@After
public void onExit() {
// code exécuté après chaque test
}
}
- Exécuter le test. Vous devriez avoir un NullPointerException du fait que paieUtils n'est pas valorisé.
Première configuration Spring
Nous allons à présent récupérer une instance de paieUtils via une configuration Spring.
- Créer un fichier de configuration Spring src/main/resources/app-config.xml (clic droit > Spring Bean Configuration File). Ajouter le contenu suivant qui ajouter un bean appelé paieUtils.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="paieUtils" class="dev.paie.util.PaieUtils"></bean>
</beans>
Dans la classe de test dev.paie.util.PaieUtilsTest :
- Ajouter un champ context :
private ClassPathXmlApplicationContext context;
- Compléter la méthode onSetup :
@Before
public void onSetup() {
context = new ClassPathXmlApplicationContext("app-config.xml");
paieUtils = context.getBean(PaieUtils.class);
}
- Compléter la méthode onExit :
@After
public void onExit() {
context.close();
}
Vérifier que le test est passant.
Ajouter un autre cas de test.
Partie 2 - Jeux de données
Construisons à présent un jeux de données avec Spring.
- Visualiser les fichiers cotisations-imposables.xml et cotisations-non-imposables.xml :
/src
/main
/resources
cotisations-imposables.xml
cotisations-non-imposables.xml
Ils contiennent les définitions des cotisations.
Créons à présent un objet bulletin1 qui représenterait un jeux de données complet.
- Créer un test unitaire dev.paie.util.JeuxDeDonneesTest :
public class JeuxDeDonneesTest {
private ClassPathXmlApplicationContext context;
private BulletinSalaire bulletin1;
@Before
public void onSetup() {
context = new ClassPathXmlApplicationContext("jdd-config.xml");
bulletin1 = context.getBean("bulletin1", BulletinSalaire.class);
}
@Test
public void test_primeExceptionnelle() {
assertThat(bulletin1.getPrimeExceptionnelle(), equalTo(new BigDecimal("1000")));
}
@Test
public void test_employe() {
assertThat(bulletin1.getRemunerationEmploye().getMatricule(), equalTo("M01"));
}
@Test
public void test_entreprise() {
assertThat(bulletin1.getRemunerationEmploye().getEntreprise().getSiret(), equalTo("80966785000022"));
assertThat(bulletin1.getRemunerationEmploye().getEntreprise().getDenomination(), equalTo("Dev Entreprise"));
assertThat(bulletin1.getRemunerationEmploye().getEntreprise().getCodeNaf(), equalTo("6202A"));
}
@Test
public void test_cotisationsNonImposables() {
List<Cotisation> cotisationsNonImposables = bulletin1.getRemunerationEmploye().getProfilRemuneration()
.getCotisationsNonImposables();
Stream.of("EP01", "EP02", "EP03", "EP04", "EP05", "EP06", "EP07", "EP12", "EP19", "EP20", "EPR1", "E900",
"EP28", "EP37")
.forEach(code -> assertTrue("verification code " + code,
cotisationsNonImposables.stream().filter(c -> c.getCode().equals(code)).findAny().isPresent()));
}
@Test
public void test_cotisationImposables() {
List<Cotisation> cotisationsImposables = bulletin1.getRemunerationEmploye().getProfilRemuneration()
.getCotisationsImposables();
Stream.of("SP01", "SP02")
.forEach(code -> assertTrue("verification code " + code,
cotisationsImposables.stream().filter(c -> c.getCode().equals(code)).findAny().isPresent()));
}
@Test
public void test_grade() {
assertThat(bulletin1.getRemunerationEmploye().getGrade().getNbHeuresBase(), equalTo(new BigDecimal("151.67")));
assertThat(bulletin1.getRemunerationEmploye().getGrade().getTauxBase(), equalTo(new BigDecimal("11.0984")));
}
@After
public void onExit() {
context.close();
}
}
- Créer un fichier jdd-config.xml qui permet de rendre le test passant.
Quelques indications :
<!-- exemple de valorisation de liste -->
<bean id="profil1" class="dev.paie.entite.ProfilRemuneration">
<property name="cotisationsNonImposables">
<util:list value-type="dev.paie.entite.Cotisation">
<ref bean="ep01" />
</util:list>
</property>
</bean>
<!-- importer une configuration dans une autre -->
<import resource="classpath:cotisations-non-imposables.xml" />
AssertJ
- Vous vous souvenez d'AssertJ ? Bien sûr que oui ! Remplacer les assertions des tests par des assertions AssertJ.