如何模拟一个以int数组作为输入并操纵数组元素的方法?我相信我们可以用doAnswer()做到这一点,但我无法在那里表示输入类型。
class View {
public void getLocationOnScreen(int[] location) {
//this method assigns elements of the array.
location[0] = 5;
location[1] = 6;
}
}
答案 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 []));