【发布时间】:2015-11-08 07:37:05
【问题描述】:
我正在运行测试以查看我输入到文件中的值是否与我从 API 生成的值相同。所以我有从我的 API 生成的实际值,还有另一个预期值列表。我遇到的问题是我无法进行苹果与苹果的比较。
例子:
Actual = {red, bleu, yellow, purple}
expected = {bleu, red, purple, yellow}
failure: red != bleu, bleu != red, yellow != purple, purple != yellow
除了向您展示我的代码之外,我不确定如何更好地描述我所说的内容。
这是我的代码:
TreeSet<String> hashSet = (TreeSet<String>) calcGraph.getInputs();
boolean success = true;
String error="";
for(String xpath : hashSet) {
String actual = someApi(response, expression, xpath);
for ( String values : data.getDataOutputs().keySet() ) {
String expected = data.getDataOutputs().get(expectedXpath);
if ( !expected.equals(actual)) {
error+= "\nExpected : " + expected +"\nActual: " +actual+"\n";
success = false;
} if ( !success ) Assert.fail(error);
}
}
如何在 1 个 foreach 循环或等效循环中比较这些列表?任何帮助或帮助将不胜感激。
编辑:
Iterator<String> expectation = expectedList.iterator();
Iterator<String> actuation = actualList.iterator();
while((expectation.hasNext()) && (actuation.hasNext())) {
String exp = expectation.next();
String act = actuation.next();
logger.info("Expected: "+exp);
logger.info("Actual: "+act);
// Validation check
if ( !exp.equals(act)) {
error+= "\nExpected : " + exp +"\nActual: " +act+"\n";
success = false;
} if ( !success ) Assert.fail(error);
}
顺序很重要,所以这将失败......
【问题讨论】:
-
for-each 不适合这份工作。你需要一个普通的 for 循环。
-
我在这里没有看到任何列表。我看到了一个
hashSet变量(这意味着一个HashSet)和一个Map(data.getExplanationOutputs())。您要比较哪些列表? -
你要使用assertj;它有针对此类情况的断言 (
assertThat(list1).containsExactlyElementsOf(list2))。 -
如果您只想知道两个集合是否具有相同的元素,只需使用
set1.equals(set2)。 -
@fge 我们不知道 OP 使用的是哪个 Map 实现,但如果它没有排序,那么在它的 keySet 上的迭代顺序已经没有意义了。
标签: java collections foreach conceptual