J'ai lu ici quelques discussions sur les méthodes statiques et je pense comprendre les problèmes que peuvent entraîner une mauvaise utilisation / utilisation excessive des méthodes statiques. Mais je n'ai pas vraiment compris pourquoi il est difficile de se moquer des méthodes statiques.
Je sais que d'autres cadres de simulation, comme PowerMock, peuvent le faire, mais pourquoi pas Mockito?
J'ai lu cet article , mais l'auteur semble être religieusement contre le mot static
, c'est peut-être ma mauvaise compréhension.
Une explication / lien facile serait formidable.
Réponses:
Je pense que la raison peut être que les bibliothèques d'objets factices créent généralement des simulations en créant dynamiquement des classes au moment de l'exécution (en utilisant cglib ). Cela signifie qu'ils implémentent une interface au moment de l'exécution (c'est ce que fait EasyMock si je ne me trompe pas), ou ils héritent de la classe pour se moquer (c'est ce que fait Mockito si je ne me trompe pas). Les deux approches ne fonctionnent pas pour les membres statiques, car vous ne pouvez pas les remplacer à l'aide de l'héritage.
La seule façon de se moquer de la statique est de modifier le code d'octet d'une classe au moment de l'exécution, ce qui, je suppose, est un peu plus complexe que l'héritage.
C'est ma conjecture, pour ce que ça vaut ...
la source
Si vous devez vous moquer d'une méthode statique, c'est un indicateur fort d'une mauvaise conception. Habituellement, vous vous moquez de la dépendance de votre classe en cours de test. Si votre classe en cours de test fait référence à une méthode statique - comme java.util.Math # sin par exemple - cela signifie que la classe en cours de test a besoin exactement de cette implémentation (de la précision par rapport à la vitesse par exemple). Si vous voulez faire abstraction d'une implémentation concrète de sinus, vous avez probablement besoin d'une interface (vous voyez où cela va)?
la source
Je pense sérieusement que c'est une odeur de code si vous devez également vous moquer des méthodes statiques.
La seule fois où cela me semble exagéré, ce sont des bibliothèques comme Guava, mais vous ne devriez pas avoir besoin de se moquer de ce type de toute façon car cela fait partie de la logique ... (des trucs comme Iterables.transform (..)) De
cette façon, votre propre code reste propre, vous pouvez simuler toutes vos dépendances de manière propre et vous disposez d'une couche anti-corruption contre les dépendances externes. J'ai vu PowerMock dans la pratique et toutes les classes pour lesquelles nous en avions besoin étaient mal conçues. De plus, l'intégration de PowerMock a parfois causé de graves problèmes
(par exemple https://code.google.com/p/powermock/issues/detail?id=355 )
PS: Il en va de même pour les méthodes privées. Je ne pense pas que les tests devraient connaître les détails des méthodes privées. Si une classe est si complexe qu'elle tente de se moquer des méthodes privées, c'est probablement un signe pour diviser cette classe ...
la source
@Inject SomeDependency
et dans ma configuration, je définisbind(SomeDependency.class).in(Singleton.class)
. Donc si demain ce n'est plus un Singleton, je change la config et c'est tout.Foo.getInstance()
partout. Je viens d'écrire singleton dans la réponse pour contrer l'argument "mais une méthode statique ne nécessite pas la création de nombreux objets wrapper". Sur le plan conceptuel également, il y a peu de différence entre une méthode statique et une méthode d'instance sur un singleton, juste que vous ne pouvez pas vous moquer de ce collaborateur singleton. Mais singleton ou non n'est absolument pas le point que j'essayais de faire valoir, le point est d'injecter et de se moquer des collaborateurs et de ne pas appeler de méthodes statiques si cela rend les tests difficiles.Mockito renvoie des objets mais statique signifie "niveau classe, pas niveau objet". Ainsi, mockito donnera une exception de pointeur nul pour statique.
la source
Dans certains cas, les méthodes statiques peuvent être difficiles à tester, surtout si elles doivent être simulées, c'est pourquoi la plupart des frameworks de simulation ne les prennent pas en charge. J'ai trouvé ce billet de blog très utile pour déterminer comment se moquer des méthodes et des classes statiques.
la source