2017-02-08 1 views
3

J'ai un projet de démarrage Spring qui comporte une suite de tests unitaires qui utilisent @InjectMocks de mockito pour instancier la classe testée et injecter tous les faux qui peuvent y être présents.@Autowire combiné avec @InjectMocks

En d'autres termes, si je cette

@InjectMocks MyClass MyClass;

Je ne ai pas besoin

MyClass myClass = new MyClass();
ou @Autorisé MyClass myClass;

Jusqu'à présent, cette configuration a bien fonctionné. Cependant, plus récemment, il est devenu nécessaire d'avoir accès aux propriétés de démarrage du projet lors de l'exécution des tests. Cela signifie qu'il a été nécessaire d'utiliser le runner de tâches SpringBoot dans les tests pour que toutes les instances de @Autowire (y compris celles qui instancient la classe Environment) fonctionnent.

J'ai découvert que si @InjectMocks est utilisé pour instancier une classe alors toutes les instances de @Autowired dans la classe ne fonctionnent pas (l'objet qu'ils doivent créer est null). Cela signifie aucune classe d'environnement et aucun accès aux propriétés Spring.

Au lieu de cela je dois ajouter @Autowired à l'annotation @InjectMocks

donc ce

@InjectMocks MaClasse myClass;

devient ce

@Autowired
@InjectMocks MyClass MyClass;

Ma question est simple. Y at-il quelque chose de mal à faire cela? Double-instancie myClass ou fait tout ce qui peut causer des problèmes

Répondre

4

Je pense que vous mélangez les annotations qui appartiennent au printemps et celles qui appartiennent à Mockito. Lorsque vous exécutez simplement votre application Web, @Autowired fournit à votre classe une dépendance particulière. De cette façon, vous n'avez pas besoin de créer manuellement des objets avec le mot clé new. Mais à l'exécution, ce ne sont que les annotations printanières qui sont en jeu. Les annotations mockito ne sont pas destinées à ce cas d'utilisation.

Lorsque vous exécutez des tests, c'est l'inverse. Maintenant, les annotations de printemps ne feront rien, ce sont les annotations de mockito qui fonctionnent. @InjectMocks dira à mockito: "Tout ce que j'ai fourni avec @Mock et qui est nécessaire pour cette classe, il suffit de le coller là-dedans". Il le fera même si vous n'avez pas mis @Autowired sur ce champ. Mockito ne se soucie pas des annotations de printemps.

Pour votre question: Je ne vois pas de cas d'utilisation où vous placeriez @Autowired et @InjectMocks au même endroit. Utilisez les annotations de printemps dans la logique de votre application et les annotations mockito dans vos tests.

Je sais que la réponse est assez abstraite, mais c'est aussi votre question. Pour obtenir une aide plus spécifique, vous devez fournir a minimal, complete and verifiable example.