2016-12-14 13 views
1

スタブのvoidメソッドのメソッド本体をどのように置き換えることができますか?このような 何か:副作用を伴うmockitoのvoidメソッドのスタブ

interface Foo { 
    void foo(Integer j); 
} 

(...) 

Foo mockFoo = mock(Foo.class); 

Answer<Void> ans = invocation -> { 
      Object[] args = invocation.getArguments(); 
      System.out.println("called with arguments: " + Arrays.toString(args)); 
      return null; 
     }; 

when(mockFoo.foo(any())).thenAnswer(ans); 

(...) 

mockFoo.foo(5) // Should print out "called with arguments: [5]" 

パラメータにアクセスできるように、そしてそれらのパラメータを使用して、いくつかのコードを実行できることが重要です。

我々はdoAnswer(ans).when(mockFoo).foo(any());を試してみましたが、モックを設定するときには、ANSラムダ数回のボディを実行するようで、それが.when(mockFoo).foo(any())呼び出しの間にいくつかの奇妙な理由で、「ヌル」に当社mockFoo変数をリセットします。

だから、効果的に:

Foo mockFoo = mock(Foo.class) 
// mockFoo is an instance of a Foo$MockitoMock 

Foo o = doAnswer(ans).when(mockFoo); 
// mockFoo just became null at this point..?! 
o.foo(any()); 

P.S.テストを実行するためにVertxUnitRunnerを使用していますが、問題はMockitoJUnitRunnerでも同じです。

おかげで、コメントで解決 アコス・Vandra

+0

http://stackoverflow.com/questions/2276271/how-to-make-mock-to-void-methods-with-mockito – pringi

+0

あなたが持っているものは正しいですし、確かに理由はありません 'mockFoo'リセットする必要があります。あなたが投稿したスニペットではなく、実際のテストボディセットアップを教えてください。あなたが投稿したコードではなく、そこに問題があると感じています。 –

+0

@JeffBowmanあなたは正しいです。私の実際のテストでは、原因と思われるintのパラメータとしてany()を指定していました。それをanyInt()に置き換えることで問題は解決されました。 –

答えて

0

あなたは正しかったです。私の実際のテストでは、原因と思われるintのパラメータとしてany()を指定していました。それをanyInt()に置き換えることで問題は解決されました。

例外はMockitoのコントロールの外の前にある(による消去に必要な)Mockitoのデフォルトnull値(原因のJava 5+セマンティクスに必要な)自動的にアンボクシングされて、から来ているので、これは、警告を出すことは困難ですあなたのテストが呼び出しようとしているメソッドシグネチャを知っているMockito。これはMockito例外でもMockitoが意図的に呼び出す例外でもないので、エラーメッセージを提案で修正することは困難です。

Mockitoマッチャーをプリミティブ値で使用する場合は、適切なプリミティブ(anyIntintThatなど)を使用します。

関連する問題