You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mockito返回单元素Object[]列表时被扁平化,如何解决?

问题描述

以下代码运行符合预期,返回包含两个Object[]元素的列表,断言通过:

when(query.getResultList()).thenReturn(List.of(
          new Object[] {
              "123",
              new BigDecimal("100"),
              "5/24/2024"
          },
          new Object[] {
              "456",
              new BigDecimal("10000"),
              "9/17/2024"
          }));
assertThat(query.getResultList()).hasSize(2);

但仅返回单个Object[]时不符合预期:query.getResultList()返回的是["456", new BigDecimal("10000"), "9/17/2024"](把数组元素拆成了列表元素),而非预期的[["456", new BigDecimal("10000"), "9/17/2024"]],导致断言失败:

when(query.getResultList()).thenReturn(List.of(
          new Object[] {
              "456",
              new BigDecimal("10000"),
              "9/17/2024"
          }));
assertThat(query.getResultList()).hasSize(1);
原因

List.of(T...)的可变参数特性导致:当传入单个Object[]时,JVM会将数组拆分为可变参数的多个元素(因为Object[]可以匹配Object...),最终生成的列表元素是数组里的每个对象,而非数组本身。而传入多个Object[]时,每个数组都会被当作独立的Object元素,因此生成的是包含数组的列表。

解决方案

有两种简单的解决方式:

方式一:显式构造List<Object[]>

创建一个明确类型为List<Object[]>的集合,再添加数组元素:

List<Object[]> singleResult = new ArrayList<>();
singleResult.add(new Object[] {
    "456",
    new BigDecimal("10000"),
    "9/17/2024"
});
when(query.getResultList()).thenReturn(singleResult);

方式二:强制将数组转为Object传入List.of

通过强制类型转换,让List.of把单个数组当作一个Object元素,而非可变参数的数组:

when(query.getResultList()).thenReturn(List.of((Object) new Object[] {
    "456",
    new BigDecimal("10000"),
    "9/17/2024"
}));

这样就能让Mockito返回包含单个Object[]元素的列表,断言hasSize(1)会正常通过。

内容的提问来源于stack exchange,提问作者david

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 20:32:40