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?.
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”));
}
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.
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)
.
@ 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"));
}
}