2016-04-06 15 views
4

für eine Einheit Tests Ich versuche zu überprüfen, ob es eine Möglichkeit gibt, einen Methodenaufruf innerhalb einer Methode mit Mockito Verify zu verifizieren?Mockito verify Methode Aufruf innerhalb Methode

Ein Beispiel wäre:

public delete(param) { 
    VideoService.deleteVideo(param); << i want to verify the call of this method 
    return etc.. 
} 

ich, wenn löschen überprüfen heißt mit:

verify(mock,times(1)).delete(param); 

Gibt es auch wie eine Art und Weise, wie das Innere Verfahren zu überprüfen: überprüfen (Mock, mal (1)) löschen (param) .VideoService.deleteVideo (param);

+0

Ist 'VideoService.deleteVideo' eine statische Methode oder' VideoService' eine Instanzvariable? –

Antwort

0

Sie kann einen Spion benutzen.

public class MyVideoService { 

    private VideoService videoService; 

    public MyVideoService(VideoService videoService) { 
    this.videoService = videoService; 
    } 

    public void delete(String param) { 
    videoService.deleteVideo(param); 
    } 
} 

public class VideoService { 
    public void deleteVideo(String param) { 
    } 
} 

Wenn Sie nun ein Objekt testen wollen, die MyVideoService verwendet. Z.B.

public class ObjectThatUsesMyVideoService { 

    private MyVideoService myVideoService; 

    ObjectThatUsesMyVideoService(MyVideoService myVideoService) { 
    this.myVideoService = myVideoService; 
    } 

    public void deleteVideo(String param) { 
    myVideoService.delete(param); 
    } 
} 

Sie können einen Test schreiben wie diese

public class MyVideoServiceTest { 

    @Test 
    public void delete(){ 
    // VideoService is just a mock 
    VideoService videoServiceMock = Mockito.mock(VideoService.class); 

    // Creating the real MyVideoService 
    MyVideoService myVideoService = new MyVideoService(videoServiceMock); 

    // Creating a spy proxy 
    MyVideoService myVideoServiceSpy = Mockito.spy(myVideoService); 

    ObjectThatUsesMyVideoService underTest = new ObjectThatUsesMyVideoService(myVideoServiceSpy); 

    underTest .deleteVideo("SomeValue"); 

    // Verify that myVideoService was invoked 
    Mockito.verify(myVideoServiceSpy, Mockito.times(1)).delete("SomeValue"); 

    // Verify that myVideoService invoked the VideoService 
    Mockito.verify(videoServiceMock, Mockito.times(1)).deleteVideo("SomeValue"); 
    } 
} 
+0

Aber wie funktioniert das? Auf diese Weise werde ich nie wissen, ob das deleteVideo in der orginall-Klasse aufgerufen wird. Wird das nicht nur das Problem verschieben und meine reale Situation nicht testen? – Tvt

+0

Ich denke, ich weiß einfach nicht, was Sie testen möchten. Bitte aktualisieren Sie Ihre Frage. –

+0

Nur müssen Sie den Code neu schreiben, es ist schlecht geschrieben Ihre Klasse hatte einen Teil des Grusses dafür, um Ihnen zu danken! :) – Tvt

0

Nehmen wir an, Sie eine Klasse haben

class MyVideoService { 

final VideoService videoService; 

public MyVideoService(VideoService videoService) { 
    this.videoService = videoService; 
} 

public void delete(param) { 
    videoService.deleteVideo(param); 
} 
} 

Dazu Mock Videoservice mit

VideoService videoService = mock(VideoService.class); 

Und schaffen MyVideoService mit diesem verspottet Beispiel Call-Methode, überprüfen:

MyVideService myVideoService = new MyVideoService(videoService); 
myVideoService.delete (param); 
verify(videoService, times(1)).deleteVideo(param); 
+0

Ja das ist genau wie mi erstes Beispiel, aber das ist nicht meine Frage .. Ich möchte überprüfen, ob videoService.deletevideo (param) aufgerufen wird, wenn delete aufgerufen wird gibt es einen Weg dafür? – Tvt

+0

Entschuldigung, es gibt einen Tippfehler in meinem Code. Die letzte Zeile sollte wie folgt lauten: verify (videoService, mal (1)) deleteVideo (param); Wir überspielen VideoService und überprüfen dann, ob die Methode beim Aufruf von MyVideoService.delete() aufgerufen wurde. – Lukichev

+0

Aber was ist, wenn Ihr Konstruktor videoService dafür nicht benötigt? und es so bassisch brechen zu lassen ... Bekommen Sie den Kenner aber und würden wahrscheinlich arbeiten, wenn die Anwendung anders entworfen wurde. – Tvt

Verwandte Themen