2016-05-05 7 views
1

int配列を入力として受け取り、配列要素を操作するメソッドをモックするにはどうすればよいですか?私はdoAnswer()でそれを行うことができると信じていますが、そこに入力タイプを表現することはできません。Mockito:入力配列パラメータを操作するメソッドをモックします

class View { 
    public void getLocationOnScreen(int[] location) { 
    //this method assigns elements of the array. 
    location[0] = 5; 
    location[1] = 6; 
    } 
} 

答えて

0

モックを実行すると、テストはそのメソッドを通過しません。だから、あなたは本当にそのメソッドのロジックを気にしないだけで、あなたが待つオブジェクトの種類を返すだけです。

あなたの所在地は無効な方法なので、何も返されません。 。

+0

私はそのメソッドが呼び出されたときに、配列の要素にモック値を設定する必要があり、配列の更新されたこれらの要素はでgetLocationOnScreenメソッドを呼び出した後、さらにロジックで使用されて、私はそこに笙を信じているので。 uldは配列の要素を模倣してそのメソッドを呼び出すことができます。 –

2

これを試してみてください

Mockito.doAnswer(new Answer<Object>() { 
      @Override 
      public Object answer(InvocationOnMock invocation) throws Throwable { 
       Object[] args = invocation.getArguments(); 
       int[] location = (int[]) args[0]; 
       return location; 
      } 
     }).when(view).getLocationOnScreen(Matchers.any(int [])); 
+0

これは動作します。小さな変化だけ。 "Matchers.any()"と言うのではなく、整数配列を渡さなければなりませんでした。 –

1

ルックをこれである場合には、

Mockito.when(でgetLocationOnScreen(Mockito.any(INT []クラス)):だから、ちょうどこのような何かをする必要があります。あなたは期待するもの:。

@Test 
public void getLocationOnScreen() throws Exception { 
    View mockView = mock(View.class); 

    // Prepare the integer array to test. 
    int[] location = new int[2]; 

    // Verify interactions 
    mockView.getLocationOnScreen(location); 
    verify(mockView).getLocationOnScreen(location); 

    // Stub voids 
    doAnswer(new Answer() { 
     @Override 
     public int[] answer(InvocationOnMock invocation) throws Throwable { 
      int[] args = (int[])(invocation.getArguments()[0]); 
      args[0] = 5; 
      args[1] = 6; 
      return args; 
     } 
    }).when(mockView).getLocationOnScreen(location); 

    // Asserts 
    mockView.getLocationOnScreen(location); 
    assertEquals(5, location[0]); 
    assertEquals(6, location[1]); 
} 
+0

Ahmedの答えと同じですが、より精巧です。ありがとう。 –

関連する問題