问题描述
public int[] processData(List<Data> dataList){
//business logic
}
我用下面的方式来模拟它
when(processData(anyList())).thenReturn(new int[]{1,1});
和
when(processData(Mockito<Data>.anyList())).thenReturn(new int[]{1,1});
但没有任何效果。
我在 Java 11 和 Mockito 3.1 中使用 Spring Boot
还有其他方法可以模拟吗?
解决方法
Mockito 利用 equal()
作为验证/匹配参数值的传统方法。
在某些情况下,用户在验证参数值时需要更大的灵活性,因此最好使用参数匹配器而不是 equal()
方法。
注意:
- eq(obj) 根据它的 equals 方法检查参数是否等于 obj。即使您在不使用匹配器的情况下传递真实值,这也适用。
-
equals()
方法要求两个列表要相等,它们必须以相同的顺序包含相同的元素。 - 如果有两个列表,您的列表类型应该匹配。
详情请参阅文档:https://docs.oracle.com/javase/6/docs/api/java/util/List.html#equals%28java.lang.Object%29
,你的例子对我有用:
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static org.mockito.ArgumentMatchers.anyList;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
public class Test {
@Mock
A a;
@org.junit.jupiter.api.Test
public void t1() {
when(a.processData(anyList())).thenReturn(new int[]{1,1});
System.out.println(Arrays.toString(a.processData(new ArrayList<>())));
}
}
interface Data {}
interface A {
int[] processData(List<Data> dataList);
}
这会打印:[1,1]
您可以尝试使用 when(processData(mock(List.class)).thenReturn(new int[]{1,1}) 但您的变体 when(processData(anyList())).thenReturn(new int[ ]{1,1}) 也适用于我。