web-dev-qa-db-fra.com

Mockito NotaMockException

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. 

11
learningMyWayThru

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 mocking ou spying 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();
  }
} 
22
Mureinik

Voici quelques astuces:

  1. Se moquer de l'activité.
  2. Modifiez le comportement de secondMethod avec when/then/doReturn
  3. Utilisez doCallRealMethod lorsque firstMethod est appelé.

J'espère que ça aide.

0
Pavan Kumar