Ausnahme: mockito wollte, aber nicht aufgerufen, tatsächlich gab es null Interaktionen mit diesem Mock

Lesezeit: 3 Minuten

Benutzer-Avatar
Benutzer3096719

Ich habe eine Schnittstelle

Interface MyInterface {
  myMethodToBeVerified (String, String);
}

Und die Implementierung der Schnittstelle ist

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

Ich habe eine andere Klasse

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

Ich versuche, JUnit für MyClass zu schreiben. Ich habe getan

class MyClassTest {
    MyClass myClass = new MyClass();
  
    @Mock
    MyInterface myInterface;

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

Aber ich bekomme mockito gesucht, aber nicht aufgerufen. Tatsächlich gab es null Interaktionen mit diesem Mock beim Bestätigungsaufruf.

kann jemand einige Lösungen vorschlagen.

Benutzer-Avatar
Jk1

Sie müssen Mock in die Klasse einfügen, die Sie testen. Im Moment interagierst du mit dem realen Objekt, nicht mit dem Scheinobjekt. Sie können den Code auf folgende Weise reparieren:

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

obwohl es klüger wäre, den gesamten Initialisierungscode in zu extrahieren @Before

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

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

  • Warum können wir nicht verwenden Mockito.mock hier?

    – IgorGanapolsky

    23. Januar 2017 um 16:23 Uhr

  • @IgorGanapolsky: Wir können Mockito.mock verwenden, dafür müssen wir eine Setter-Methode für myObj verwenden und das verspottete Objekt auf myObj setzen.

    – vijaya kumar

    22. Februar 2017 um 21:27 Uhr

Deine Klasse MyClass schafft ein neues MyClassToBeTestedanstatt Ihren Schein zu verwenden. Mein Artikel im Mockito-Wiki beschreibt zwei Möglichkeiten, damit umzugehen.

  • HikariDataSourceProvider dataSourceProvider = mock(DataSourceProvider.class); verifizieren(dataSourceProvider).shutdown(); was ist daran problematisch

    – Irfan Nassim

    18. Juli 2018 um 9:43 Uhr

Benutzer-Avatar
Kevin Welker

Die Antwort von @ Jk1 ist in Ordnung, aber Mockito ermöglicht auch eine prägnantere Injektion mithilfe von Anmerkungen:

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

Aber unabhängig davon, welche Methode Sie verwenden, werden die Anmerkungen nicht verarbeitet (nicht einmal Ihr @Mock), es sei denn, Sie rufen irgendwie die Statik auf MockitoAnnotation.initMocks() oder kommentieren Sie die Klasse mit @RunWith(MockitoJUnitRunner.class).

Benutzer-Avatar
vijaya kumar

Die Antwort von @jk1 ist perfekt, da @igor Ganapolsky gefragt hat, warum können wir hier nicht Mockito.mock verwenden? Ich poste diese Antwort.

Dafür haben wir eine Setter-Methode für myobj bereitgestellt und den myobj-Wert mit einem verspotteten Objekt gesetzt.

class MyClass {
    MyInterface myObj;

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

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

In unserer Testklasse müssen wir den folgenden Code schreiben

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"));
     }
}

Diese Ausnahme kann auch ausgelöst werden, wenn Sie beispielsweise erwarten, dass thisMethod() ausgeführt wird, dies jedoch nicht der Fall ist. Das war nicht der Fall, weil es sich um eine Bedingung handelt, die nicht erfüllt wurde.

Wenn Sie beispielsweise einen Komponententest haben, der besagt, dass vergewissern Sie sich, dass thisMethod() ausgeführt wird, dies jedoch nicht der Fall war, da varX und varY nicht gleich sind.

//method expected to be called.    
if( varX == varY){
     thisMethod();
  }

 //test
 Mockito.verify(foo).thisMethod();

1381850cookie-checkAusnahme: mockito wollte, aber nicht aufgerufen, tatsächlich gab es null Interaktionen mit diesem Mock

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy