2017-08-03 1 views
3

Venant de Java, je travaille sur le code php et je veux ajouter des tests unitaires pour mon code.Dépendances d'injection automatique pour les tests unitaires

J'ai une classe de service qui a une classe de DAO comme ci-dessous:

class ServiceClass { 

    private $daoClass; 

    public function methodToTest(){} 
} 

Je ne fournis pas un constructeur, ni j'ajouter une méthode setter pour la propriété daoClass. C'est parce qu'il sera injecté en utilisant le conteneur PHP-DI IoC. Pour les tests unitaires, j'utilise phpunit, donc je me moque de l'objet daoClass et j'utilise la réflexion pour injecter cette propriété directement (puisqu'il n'y a pas de constructeur ou de setter pour cette propriété).

En Java, nous pouvons facilement faire cela sans la substance de réflexion en utilisant @InjectMocks annotation ou MockitoAnnotations.initMocks méthode.

Je ne suis pas en mesure de trouver une manière similaire de le faire dans phpunit.

En outre, une question différente mais liée, est-il possible dans mon test que je peux créer une propriété privée et annoter avec une balise, et il est automatiquement converti en une instance d'objet simulacre? Comme comment mockito dans Java le fait @Mock annotation.

+1

avez-vous vérifié cela? https://github.com/eltrino/PHPUnit_MockAnnotations –

+1

comme je suppose que PHP-DI [injection sur la fonction des instances existantes] (http://php-di.org/doc/inject-on-instance.html) est utilisé. Envisageriez-vous de l'utiliser pour assembler des objets testés? Fondamentalement, vous faites par les mains mêmes choses qu'il fait .. – xmike

Répondre

0

Je ne me connais pas d'annotation simulée (voir le premier commentaire pour un lien de ce genre), mais pour vos besoins de test, vous pouvez créer votre propre maquette pour ces classes de service en PHP pur que vous utilisez en test. Ceci est plutôt simple et nécessite seulement que l'autoloading soit correctement configuré pour le développement. Cela a l'avantage que votre bibliothèque est livrée avec des répliques appropriées, que vous pouvez mélanger au code de production avec des annotations conçues uniquement pour les tests, mais diffusées dans un contexte sans test.

Cela peut ne pas être exactement ce que vous cherchez quand vous venez de Java, mais j'ai fait de bonnes expériences en PHP avec de tels assistants de test "manuscrits", surtout quand il s'agit d'une famille de classes. En fin de compte, ils sont très utiles et peuvent assurer beaucoup de répétitions dans les tests. Parfois, ils sont même nécessaires car les simulacres créés dynamiquement ne peuvent pas exprimer et affirmer ce qui pourrait être requis dans les tests.