当前位置: 首页 > 面试题库 >

如何用JUnit测试那两个列表 包含相同顺序的相同元素?

濮阳和泰
2023-03-14
问题内容

语境

我正在为该类编写一个简单的 JUnit
测试MyObject

MyObject可以从静态工厂方法,需要一个可变参数的创建
字符串

MyObject.ofComponents("Uno", "Dos", "Tres");

在的存在期间的任何时间MyObject,客户端可以检查它通过在的形式创建的参数 列表
,通过.getComponents()方法。

myObject.ofComponents(); // -> List<String>: { "Uno", "Dos", "Tres" }

换句话说,a MyObject既记住并公开了使之成为现实的参数列表。有关此合同的更多详细信息:

  • 的顺序getComponents将与为对象创建选择的顺序相同
  • 允许重复的后续 String 组件并按顺序保留
  • 行为null未定义(其他代码保证没有null出厂)
  • 对象实例化后,无法更改组件列表

我正在编写一个简单的测试,该测试MyObject
String 列表创建一个,并检查它是否可以通过返回相同的列表.getComponents()
我立即执行此操作,但这应该在现实的代码路径中一定距离处发生

这是我的尝试:

List<String> argumentComponents = Lists.newArrayList("One", "Two", "Three");
List<String> returnedComponents =
    MyObject.ofComponents(
        argumentComponents.toArray(new String[argumentComponents.size()]))
        .getComponents();
assertTrue(Iterables.elementsEqual(argumentComponents, returnedComponents));

  • 谷歌番石榴 Iterables.elementsEqual()最好的办法,只要我有库在我的构建路径,那些两个列表比较? 我一直在为此苦恼; 我应该使用遍及Iterable ..检查大小然后迭代运行的.equals()..或Internet搜索建议的任何其他方法的帮助器方法吗?比较单元测试列表的规范方法是什么?

我希望获得的可选见解

  • 方法测试是否设计合理?我不是 JUnit 专家!
  • .toArray()List 转换为 E 的可变参数的最佳方法是吗?

问题答案:

我更喜欢使用Hamcrest,因为如果出现故障,它可以提供更好的输出

Assert.assertThat(listUnderTest, 
       IsIterableContainingInOrder.contains(expectedList.toArray()));

而不是报告

expected true, got false

它会报告

expected List containing "1, 2, 3, ..." got list containing "4, 6, 2, ..."

IsIterableContainingInOrder.contain

Hamcrest

根据Javadoc:

为Iterables创建一个匹配器,当在经过检查的Iterable上单次通过时,该匹配器将产生一系列项目,每个项目在逻辑上均等于指定项目中的相应项目。对于正匹配,所检查的可迭代项的长度必须与指定项目的数量相同

因此,listUnderTest必须具有相同数量的元素,并且每个元素必须按顺序匹配期望值。



 类似资料:
  • 的顺序将与为创建对象选择的顺序相同 允许重复的后续字符串组件并按顺序保留 未定义的行为(其他代码保证没有进入工厂) 在对象实例化之后,没有任何方法可以更改组件列表 我正在编写一个简单的测试,该测试从字符串列表创建并检查它是否可以通过返回相同的列表。我立即这样做,但这应该发生在一个现实的代码路径的远处。 这里是我的尝试: null null

  • 根据逻辑,我需要实现两个,如果它们以相同的“相对”顺序具有相同的元素,则它们被认为是相等的。 举个例子,以下一对列表被认为彼此相等: 只要遵守相对顺序,就可以认为它们是平等的。 作为反例,这两个不相等: 导致 和 交换到位。 所以,基本上我发现这很有挑战性,因为这不是顺序完全重要的情况,也不是顺序完全不重要的情况。在这种情况下,我会使用普通的< code>list1.equals(list2)方法

  • 问题内容: 我如何测试python中两个JSON对象是否相等,而忽略列表的顺序? 例如 … JSON文档 a : JSON文档 b : 并且即使列表的顺序不同,也应该比较相等。 问题答案: 如果要使两个具有相同元素但顺序不同的对象相等,那么显而易见的事情是比较它们的排序后的副本-例如,以JSON字符串和表示的字典: …但这是行不通的,因为在每种情况下,顶层dict的项都是具有相同元素的列表,但是顺

  • 问题内容: 我如何测试python中两个JSON对象是否相等,而忽略列表的顺序? 例如 … JSON文档a: JSON文档b: 并且应该比较相等,即使列表的顺序不同。 问题答案: 如果你想要两个具有相同元素但顺序不同的对象相等,那么显而易见的事情是比较它们的排序后的副本-例如,以JSON字符串和表示的字典: …但这是行不通的,因为在每种情况下,”errors”顶层dict的项都是具有相同元素的列表

  • "给定两个字符串s和t,编写一个函数来检查s是否包含t的所有字符(顺序与字符串t相同)。返回true或false。递归不一定。这是我用java写的代码片段。问题是输入: string1="st3h5irteuyarh!"和string2="shrey"它应该返回TRUE,但它返回FALSE。那是为什么?"

  • 我想通过使用JUnit创建单元测试来测试某些字符串列表是否正确生成。 我有两个字符串列表(我的代码中的一个列表是private static final,比方说列表1),它们以不同的顺序使用相同的元素(相同的元素可以相乘): 我不想使用这种类型的函数,因为它只适用于少量元素: