web-dev-qa-db-fra.com

Exception: Mockito voulait mais n'a pas été invoqué. En fait, il n'y a eu aucune interaction avec cette maquette

J'ai une interface

Interface MyInterface {
  myMethodToBeVerified (String, String);
}

Et la mise en œuvre de l'interface est

class MyClassToBeTested implements MyInterface {
   myMethodToBeVerified(String, String) {
    …….
   }
}

J'ai une autre classe

class MyClass {
    MyInterface myObj = new MyClassToBeTested();
    public void abc(){
         myObj.myMethodToBeVerified (new String(“a”), new String(“b”));
    }

}

J'essaie d'écrire JUnit pour MyClass. j'ai fait

class MyClassTest {
    MyClass myClass = new MyClass();

    @Mock
    MyInterface myInterface;

    testAbc(){
         myClass.abc();
         verify(myInterface).myMethodToBeVerified(new String(“a”), new String(“b”));
    }
}

Mais j'obtiens mockito voulait mais pas invoqué, en fait il n'y avait aucune interaction avec cette maquette à vérifier l'appel.

quelqu'un peut-il suggérer des solutions?.

25
user3096719

Vous devez injecter une maquette dans la classe que vous testez. Pour le moment, vous interagissez avec l'objet réel, pas avec l'objet factice. Vous pouvez corriger le code de la manière suivante:

void testAbc(){
     myClass.myObj = myInteface;
     myClass.abc();
     verify(myInterface).myMethodToBeVerified(new String(“a”), new String(“b”));
}

bien que ce soit un choix plus judicieux d'extraire tout le code d'initialisation dans @Avant

@Before
void setUp(){
     myClass = new myClass();
     myClass.myObj = myInteface;
}

@Test
void testAbc(){
     myClass.abc();
     verify(myInterface).myMethodToBeVerified(new String(“a”), new String(“b”));
}
13
Jk1

Votre classe MyClass crée un nouveau MyClassToBeTested au lieu d'utiliser votre maquette. Mon article sur le wiki Mockito décrit deux manières de gérer cela.

7
Dawood ibn Kareem

La réponse de @ Jk1 est correcte, mais Mockito permet également une injection plus succincte à l'aide d'annotations:

@InjectMocks MyClass myClass; //@InjectMocks automatically instantiates too
@Mock MyInterface myInterface

Mais quelle que soit la méthode utilisée, les annotations ne sont pas traitées (pas même votre @Mock) sauf si vous appelez d'une manière ou d'une autre l'élément static MockitoAnnotation.initMocks() ou annotez la classe avec @RunWith(MockitoJUnitRunner.class).

4
Kevin Welker

@ jk1 réponse est parfaite, puisque @igor Ganapolsky a demandé, pourquoi ne pouvons-nous pas utiliser Mockito.mock ici? je poste cette réponse.

Pour cela, nous avons fourni une méthode de définition pour myobj et défini la valeur myobj avec un objet fictif.

class MyClass {
    MyInterface myObj;

    public void abc() {
        myObj.myMethodToBeVerified (new String("a"), new String("b"));
    }

    public void setMyObj(MyInterface obj)
    {
        this.myObj=obj;
    }
}

Dans notre classe de test, nous devons écrire ci-dessous le code

class MyClassTest {

MyClass myClass = new MyClass();

    @Mock
    MyInterface myInterface;

    @test
    testAbc() {
        myclass.setMyObj(myInterface); //it is good to have in @before method
        myClass.abc();
        verify(myInterface).myMethodToBeVerified(new String("a"), new String("b"));
     }
}
1
vijaya kumar