L'Injection d'une maquette d'un objet dans un objet à être testé déclaré comme un champ dans le test ne fonctionne pas à l'aide de Mockito?
J'ai une classe et je suis l'injection d'un proxy dans mon service.
Service service
{
private ServiceProxy proxy;
public Service(ServiceProxy proxy)
{
this.proxy = proxy;
}
}
Le test c'est:
ServiceTest
{
@Mock
ServiceProxy mockProxy;
Service service = new Service(mockProxy);
}
Si j'initialise ma classe comme cela, j'ai toujours un NPE
quand je veux utiliser l'objet du service. Pourquoi ne Mockito
faire cela? Ce est un moyen facile de contourner cela, au lieu de le déclarer dans chaque test?
Peut-on inclure la pile de vos entrées en phase nationale? si vous souhaitez recréer cet état de fait souvent, que diriez-vous d'une méthode dans un utilitaire de test de la classe?
Êtes-vous à l'aide de la
Êtes-vous à l'aide de la
MockitoJUnitRunner
, ou êtes-vous à l'aide de initMocks
, pour créer votre maquette?OriginalL'auteur Phoenix | 2013-10-25
Vous devez vous connecter pour publier un commentaire.
À condition que vous utilisiez Mockito version 1.9.0 ou tard, la meilleure façon d'obtenir ce que vous voulez, c'est comme ceci:
Première chose est la
@RunWith(MockitoJUnitRunner.class)
déclaration qui sera la cause de @Mock et @InjectMocks annotation pour fonctionner automatiquement sans aucune initialisation explicite. La deuxième chose, c'est que, à partir de Mockito 1.9.0 @InjectMocks annotation pouvez utiliser le Constructeur injection mécanisme qui est la meilleure option pour votre Service classe.D'autres options pour @InjectMocks sont injection par Mutateur et Champ d'injection (voir docs BTW), mais vous aurez besoin d'un constructeur sans argument à utiliser.
Donc, résumant votre code ne peut pas fonctionner, car:
Si pour quelque raison vous ne souhaitez pas utiliser @InjectMocks, le seul moyen est de construire votre Service objet à l'intérieur du corps de la méthode ou dans le @Avant annoté de la méthode de configuration.
OriginalL'auteur macias
Écrire votre classe de test, qui va initialiser
Service
avec un simulacre deServiceProxy
:btw, cela ne fonctionne pas
@Mock
définir les objets fantaisie.@InjectMocks
définit où les objets fantaisie besoin d'être injecté. Maintenant, vous avez besoin d'un type d'annotation processeur de traiter les annotations présentes dans cette classe, de sorte queMockito
peut effectivement injecter@Mock
objets dans@InjectMocks
. Et ce rôle est joué parMockitoAnnotations.initMocks(this);
quand vous dites que sa ne fonctionne pas, c'est jeter de l'exception?
Il ne fonctionne pas parce que mockProxy est nul lorsqu'il est passé au Service du constructeur.
OriginalL'auteur Debojit Saikia