微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法模拟带有 List 类型参数的方法

如何解决无法模拟带有 List 类型参数的方法

我有一个这样的方法

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() 方法。

注意:

  1. eq(obj) 根据它的 equals 方法检查参数是否等于 obj。即使您在不使用匹配器的情况下传递真实值,这也适用。
  2. equals() 方法要求两个列表要相等,它们必须以相同的顺序包含相同的元素。
  3. 如果有两个列表,您的列表类型应该匹配。

详情请参阅文档: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}) 也适用于我。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。