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
相关产品推荐
相关产品推荐

