Mockito:模拟一个操纵输入数组参数的方法

时间:2016-05-05 08:25:59

标签: java android junit mockito

如何模拟一个以int数组作为输入并操纵数组元素的方法?我相信我们可以用doAnswer()做到这一点,但我无法在那里表示输入类型。

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

4 个答案:

答案 0 :(得分: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 []));

答案 1 :(得分:2)

看看这是否符合您的期望:

@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]);
}

答案 2 :(得分:0)

如果你进行模拟,测试将不会通过该方法。因此,您并不真正关心该方法中的逻辑,您将返回一种您将要等待的对象。

您的位置是一种无效方法,因此不会返回任何内容。所以你只需要做这样的事情:

Mockito.when(getLocationOnScreen(Mockito.any(int [] .class));

答案 3 :(得分:0)

您可以使用 lambda 表达式以更简洁的方式实现

  doAnswer(invocation -> {
            Object[] args = invocation.getArguments();
            int[] location = (int[]) args[0];
            return location;
        }).when(view).getLocationOnScreen(Matchers.any(int []));