Je suis confronté à un problème avec les tests Mockito Junit. Je suis nouveau dans le domaine et je suis un peu confus avec le problème auquel je suis confronté. Toute aide à ce sujet serait appréciée.
class Activity{
public void firstMethod(){
String str = secondMethod();
}
public String secondMethod(){
String str = null;
/* some Code */
return str;
}
}
Obtenir une exception:
*org.mockito.exceptions.misusing.NotAMockException:
Argument passed to when() is not a mock!*
dans le code ci-dessous
class ActivityTest(){
Activity act;
@Before
public void setup(){
act = new Activity();
}
@Test
public void testFirstMethod(){
Mockito.doReturn(Mockito.anyString()).when(act).secondMethod();
act.firstMethod();
verify(act).secondMethod();
}
}
Je suis conscient que l’activité n’est pas un simulacre, mais je ne suis pas sûr de pouvoir le contourner, car secondMethod()
est une méthode de la même classe. Je dois écrire une règle pour secondMethod()
car j'ai déjà fait ses tests unitaires. La définition de secondMethod()
consiste en dépendances externes. Devrais-je me moquer des dépendances externes présentes dans secondMethod()
et écrire des règles pour celles-ci plutôt que de règle pour secondMethod()
?
J'ai trouvé ce post: Mockito Spy'ing sur l'objet en cours de test unitaire Cependant, séparer secondMethod () dans une classe différente n'a pas de sens. Ma méthode est liée à cette classe. Créer une classe différente pour les tests ne me semble pas correct. Même se moquer de la classe actuelle en utilisant spy () n'est pas la manière la plus correcte, comme cela a déjà été expliqué dans le post.
Je ne pense pas que je devrais créer une maquette de la classe Activity car c'est la classe que je teste. J'apprécierais vraiment l'aide et les idées à ce sujet.
Comme vous l'avez noté, act
n'est pas un simulacre et vous ne pouvez donc pas enregistrer de comportement dessus. Vous pouvez utiliser Mockito.spy
pour espionner (ou simuler partiellement) l’objet act
afin que vous enregistriez uniquement le comportement de secondMethod
et exécutiez le code réel pour firstMethod
.
Notez, cependant, que les correspondants ne peuvent pas être utilisés dans les appels doReturn
eu égard à la façon dont vous êtes mock
ing ou spy
ing votre objet. Une valeur de retour doit être un objet concret.
class ActivityTest() {
Activity act;
@Before
public void setup(){
act = Mockito.spy(new Activity()); // Here!
}
@Test
public void testFirstMethod(){
Mockito.doReturn("someString").when(act).secondMethod();
act.firstMethod();
verify(act).secondMethod();
}
}
Une syntaxe légèrement plus élégante vous permet d'utiliser des annotations au lieu d'appeler explicitement Mockito.spy
, mais c'est une question de goût:
@RunWith(MockitoJUnitRunner.class)
class ActivityTest() {
@Spy
Activity act = new Activity();
@Test
public void testFirstMethod(){
Mockito.doReturn("someString").when(act).secondMethod();
act.firstMethod();
verify(act).secondMethod();
}
}
Voici quelques astuces:
J'espère que ça aide.