vendredi 25 septembre 2026

À propos

Contact

Tests

Mockery ou les mocks natifs de PHPUnit pour tester WordPress ?

Comparaison de la syntaxe, de la puissance et de l'intégration avec les tests WordPress, sur des exemples de code réels plutôt que sur des arguments théoriques.

Par Clément Hadrot • 28 janvier 2022 • 3 min de lecture • Aucun commentaire
Mockery ou les mocks natifs de PHPUnit pour tester WordPress ?

Sur un projet de synchronisation avec un service de facturation externe, l’équipe devait tester une classe qui appelait une passerelle de paiement à travers une interface PasserellePaiement. Le débat en revue de code n’a duré que quelques minutes avant de tourner en rond : fallait-il utiliser createMock(), natif à PHPUnit, ou installer Mockery en plus ? La réponse la plus honnête est que les deux savent faire le travail de base, mais divergent nettement dès que les attentes deviennent plus fines.

Les deux outils permettent de créer un double de test respectant une interface, sans dépendre de l’implémentation réelle. La différence se joue sur l’expressivité de la syntaxe et sur la gestion des cas avancés, comme les arguments partiels ou les séquences d’appels.

Un mock simple avec PHPUnit natif

public function test_notifie_le_client_apres_paiement_reussi() {
    $passerelle = $this->createMock( PasserellePaiement::class );
    $passerelle->method( 'debiter' )
                ->willReturn( true );

    $service = new Service_Commande( $passerelle );
    $resultat = $service->valider( 4200 );

    $this->assertTrue( $resultat );
}

Pour ce cas simple, createMock() suffit largement : pas de dépendance supplémentaire, syntaxe intégrée à PHPUnit, et une lisibilité correcte pour qui connaît déjà le framework.

Le même test avec Mockery

public function test_notifie_le_client_apres_paiement_reussi() {
    $passerelle = Mockery::mock( PasserellePaiement::class );
    $passerelle->shouldReceive( 'debiter' )
                ->once()
                ->with( 4200 )
                ->andReturn( true );

    $service = new Service_Commande( $passerelle );
    $resultat = $service->valider( 4200 );

    $this->assertTrue( $resultat );
}
L'essentiel à retenir : PHPUnit natif suffit pour la majorité des interfaces simples ; Mockery brille sur les attentes complexes et les arguments partiels ; Les deux cohabitent très bien dans un même projet

La syntaxe fluide de Mockery (shouldReceive, once, with, andReturn) se lit presque comme une phrase, et exprime en une ligne une attente précise sur le nombre d’appels et l’argument exact reçu — quelque chose de plus verbeux à écrire avec les outils natifs de PHPUnit.

Où Mockery prend l’avantage

BesoinPHPUnit natifMockery
Mock simple d’une interfaceSuffisantSuffisant, plus verbeux
Vérifier l’ordre exact des appelsComplexe (callbacks manuels)ordered() natif
Correspondance partielle d’argumentsCallback de comparaison à écrireMockery::on() intégré
Mocker une classe finale ou statiqueNon supporté nativementNon supporté non plus, sans extension

Où PHPUnit natif reste préférable

Pour une équipe qui découvre les tests, ajouter Mockery en plus de PHPUnit ajoute une syntaxe supplémentaire à apprendre, une dépendance Composer de plus, et un risque de confusion entre willReturn et andReturn selon l’outil utilisé dans tel ou tel fichier. Sur un projet WordPress de taille modeste, avec peu d’interfaces à mocker, les doubles natifs de PHPUnit couvrent largement les besoins sans complexité supplémentaire.

Les deux cohabitent sans problème

Sur nos projets plus anciens, on retrouve encore des mocks PHPUnit natifs sur les interfaces simples, et Mockery réservé aux scénarios où l’ordre des appels ou la correspondance d’arguments complexe justifie sa verbosité. Rien n’oblige à choisir un camp pour tout le projet.

En résumé

Le choix entre Mockery et les mocks natifs de PHPUnit dépend de la complexité des attentes à exprimer, pas d’une préférence de principe. Ces deux outils mockent des interfaces et des classes concrètes définies par votre propre code — simuler des fonctions globales de WordPress comme get_option() sans charger le cœur est un besoin différent, qui relève d’une bibliothèque à part.

Partager :

À propos de l'auteur

Clément Hadrot

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi