2013-12-12 3 views
10

Ich habe SchnittstelleAusnahme: Mockito wollte aber nicht aufgerufen, eigentlich gab es Null Wechselwirkungen mit diesem Schein

Interface MyInterface { 
    myMethodToBeVerified (String, String); 
} 

und Umsetzung der Schnittstelle

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 bin immer Mockito wollte aber nicht aufgerufen, eigentlich gab es Null Wechselwirkungen mit dieser mock bei Anruf überprüfen.

kann jemand einige Lösungen vorschlagen.

Antwort

10

Sie müssen Mock innerhalb der Klasse, die Sie testen, injizieren. Im Moment interagierst du mit dem realen Objekt, nicht mit dem Scheinobjekt. Sie können den Code auf folgende Weise beheben:

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

obwohl es eine klügere Wahl sein würde, alle Initialisierungscode in @Before

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

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

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

+1

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

3

@ jk1 Antwort zu extrahieren ist in Ordnung, aber Mockito ermöglicht auch prägnante Injektion mit Anmerkungen:

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

Aber unabhängig davon, welche Methode Sie verwenden, werden die Anmerkungen nicht (auch nicht Ihre @Mock) verarbeitet werden, es sei denn, man irgendwie die statischen Aufruf MockitoAnnotation.initMocks() oder notieren Sie die Klasse mit @RunWith(MockitoJUnitRunner.class).

8

Ihre Klasse MyClass erstellt eine neue MyClassToBeTested, anstatt Ihren Schein zu verwenden. My article on the Mockito wiki beschreibt zwei Möglichkeiten, damit umzugehen.

1

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

Dafür haben wir eine Setter-Methode für myobj zur Verfügung gestellt und den myobj-Wert mit Mocked-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 unserem Test-Klasse, müssen wir unten 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”)); 
    } 
} 
Verwandte Themen