2016-04-06 17 views
4

ユニットテストの場合 があるかどうかを確認しようとしていますが、mockito verifyメソッドのメソッド呼び出しを検証する方法はありますか?mockito検証メソッド呼び出し内部メソッド

例は次のようになります。

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

削除がで呼び出された場合、私は確認することができます。 検証(モック、:

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

のような内部のメソッドをチェックする方法のようにもありますtimes(1))。delete(param).VideoService.deleteVideo(param);

+0

のようなテストは 'VideoService.deleteVideo'静的メソッドですか' VideoService'インスタンス変数で書くことができますか? –

答えて

0

ますスパイを使うことができます。

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) { 
    } 
} 

MyVideoServiceを使用するオブジェクトをテストする場合は、ここをクリックしてください。例えば。

public class ObjectThatUsesMyVideoService { 

    private MyVideoService myVideoService; 

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

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

あなたはこの

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

これはどうやって動作しますか?この方法で、deleteVideoがorginallクラスで呼び出されたかどうかはわかりません。これは問題を動かすだけで、私の実際の状況をテストしないでしょうか? – Tvt

+0

私はあなたが何をテストしたいのか分かりません。あなたの質問を更新してください。 –

+0

ちょうどあなたのクラスがawnserの一部を持って書いたコードを書き直す必要があります。 :) – Tvt

0

は、クラスを持っていると仮定しましょう

class MyVideoService { 

final VideoService videoService; 

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

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

次に、あなたのモック

VideoService videoService = mock(VideoService.class); 

とVideoServiceそしてこの嘲笑インスタンスとMyVideoServiceを作成し、呼び出し方法は、検証:

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

さて、これは本当に最初の例のようですが、これは私の質問ではありません。 削除が呼び出されたときにvideoService.deletevideo(param)が呼び出されているかどうかを確認したいのですが、 – Tvt

+0

申し訳ありませんが、コードに誤字があります。最後の行は次のようになります:verify(videoService、times(1))。deleteVideo(param); VideoServiceを模擬し、MyVideoService.delete()が呼び出されたときにそのメソッドが呼び出されたかどうかを確認します。 – Lukichev

+0

しかし、もしあなたのコンストラクタがこれをするためにvideoServiceを必要としないのであれば?それで大声で大胆にそれを壊すようにしてください...しかし、アプリケーションを別の方法で設計されている場合、awnserを取得して、うまく動作するでしょう。 – Tvt

関連する問題