Un petit post pour signaler que l'article "Comment tester du code intestable avec JMockit" est en ligne sur Developpez. A la base, ce blog a été crée comme "brouillon" pour écrire des tutoriaux, en particulier sur JMockit. Entre temps, le framework a pas mal évolué. L'article de […]
Mot-clé - mock
JMockit devient beaucoup moins contraignant
Je suis en train d'écrire l'article JMockit pour developpez, en testant avec la version 0.993 et je vais de surprise en surprise. En plus d'avoir développé d'autres API (JMockit Verifications pour le BDD), d'avoir mavenisé le projet, sans parler des efforts sur la documentation, Rogerio Liesenfeld […]
Unit Testing de Misko Hevery
Misko Hevery est un développeur chez Google et aborde de nombreux aspects des tests unitaires sur son blog et lors de Google TechTalks.
Je vous fais un petit topo sur la conférence Unit Testing qu'il a donné, la présentation originale est disponible sur youtube.
Le code réellement difficile à tester est caractérisé par
- un mélange de
new
et de la logique - le fait de chercher des choses (<=> par des lookups notamment)
- du traitement dans le constructeur
- des états globaux
plus que par des méthodes longues et/ou privées.
Il y a 3 types de tests, du moins au plus nombreux :
- les tests par scénario : un cas d'utilisation de l'utilisateur, tel qu'il le percoit et de bout en bout. Exemple : l'utilisateur se connecte sur l'application et saisit un mauvais mot de passe.
- les tests fonctionnels : une fonctionnalité de l'application testé de facon isolée. Exemple : un autoradio d'une voiture.
- les tests unitaires : une methode d'une classe. Exemple :
Service.hello().
JMockit : comment migrer vers la version 0.97 ou plus
Petit essai express En suivant la documentation officielle de migration, voici ce qu'il en ressort. Concernant le paramètre javaagent qui ne serait plus nécessaire, ce n'est pas si évident... Que ce soit avec Java 5, 6 avec ou sans la nouvelle annotation @RunWith(JMockit.class), mes tests semblent […]
Release >=0.97 de JMockit
JMockit est en développement actif depuis quelques mois, et une montée de version au delà de 0.96 fera échouer les tests. Certaines nouveautés du framework brise en effet l'API : https://jmockit.dev.java.net/changes.html. Le créateur du framework est encore en train de recueillir les retours pour […]
JMockit Core | Expectations : creer une implémentation vide d'une interface?
Il y a les objets que l'on souhaite mocker parce que l'on en attend des choses (que telle méthode soit appelée, avec tel paramètre) et les objets que l'on souhaite simplement bouchonner betement, pour affranchir notre test unitaire des dépendances de l'objet testé.
Les expectations de JMockit rempliront le premier besoin. La méthode newEmptyProxy de JMockit comblera des besoins plus simples, comme celui d'avoir une implémentation vide d'une interface.
JMockit Expectation : comment mocker une méthode ?
JMockit Annotation et JMockit Core impose la définition d'une classe de mock supplémentaire. JMockit Expectation permet d'effectuer des expectations sans redéfinir de classes de mock, même s'il a d'autres limitations (l'impossibilité de mocker un constructeur par exemple, ou une methode de classe abstraite).
Documentation officielle : https://jmockit.dev.java.net/javadoc/mockit/Expectations.html
JMockit Annotation | Core : comment mocker un initialiseur static?
Les blocs statiques peuvent devenir un véritable cauchemar lorsque nous essayons d'introduire des tests sur du code existant. Le bloc étant statique, nous avons beau mocker, il est tout de même appelé. Avec JMockit, il devient possible de mocker aussi ces blocs là !
JMockit Annotation | Core: Comment mocker un constructeur?
Avec JMockit Annotation
Nous avons un travailleur, et voulons implémenter sa façon de faire le diner le lundi :
public class WorkingHuman extends HumanBeing { public WorkingHuman() { } protected void makeDinner(String dayOfWeek) { } }
JMockit Annotation : comment mocker une méthode de la classe qui est testée?
Nous testons la méthode doSport()
de HumanBeing
. Nous voulons que cette dernière appelle la méthode dress()
;
public class HumanBeing extends AbstractLivingBeing { protected void doSport(){ } protected void dress(){ } }
Autrement dit, nous avons besoin de solliciter la véritable méthode doSport()
mais de mocker dress()
.
Introduction aux tests unitaires et Tests Driven Development (TDD)

Plan
- Tester avant d'implémenter
- Tester les cas exceptionnels
- Tester les appels de mocks
- Framework de mocks
- Autres articles de TDD
JMockit Core : comment substituer une classe à une autre pour un test?
Nous souhaitons qu'une methode d'une classe DependencyXyz soit mockée. Autrement dit, à chaque fois que cette dernière sera sollicitée, ce sera le mock (MockDependencyXyz
) qui sera utilisé à sa place.
Tutorial JMockit (pour les versions inférieures ou égales à 0.96)
JMockit utilise l'instrumentation pour pouvoir mocker des classes, des méthodes statiques, des blocs statiques, des méthodes privées... mais alors on peut TOUT mocker avec jmockit ?! Ah non, pas tout : jusque la version 0.97, les classes java du JRE comme Collections ne le sont pas facilement par exemple (c'est normalement possible mais je n'ai pas réussi jusqu'ici).
Les personnes qui ne sont pas familières avec les tests unitaires peuvent se mettre à niveau.
Le site officiel de JMockit comporte relativement peu de documentation, c'est sur la javadoc qu'il faut s'appuyer pour tout renseignement.
ATTENTION Tous les tutoriaux de ce site n'ont été testés qu'avec une version inférieure ou égale à 0.96. De fait, ils ne fonctionnent peut être (probablement?) pas avec une version supérieure