我正在为该类编写一个简单的 JUnit 测试MyObject。
MyObject
阿MyObject可以从静态工厂方法,需要一个可变参数的创建 字符串 。
MyObject.ofComponents("Uno", "Dos", "Tres");
在的存在期间的任何时间MyObject,客户端可以检查它通过在的形式创建的参数 列表 ,通过.getComponents()方法。
.getComponents()
myObject.ofComponents(); // -> List<String>: { "Uno", "Dos", "Tres" }
换句话说,a MyObject既记住并公开了使之成为现实的参数列表。有关此合同的更多详细信息:
getComponents
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()
.equals()
.toArray()
我更喜欢使用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必须具有相同数量的元素,并且每个元素必须按顺序匹配期望值。
listUnderTest