我看到了一些不同的选择:
如果您可以忍受适度的运行时损失,请LinkedHashMap保持插入顺序。
如果您想在不更改实现的情况下完全解决这个问题,在您的示例中,我不明白为什么您应该做一些比检查每个片段是否出现在代码中以及它们出现在WHERE. 伪代码:
Map<String, String> parametersAndValues = { "fur": "fluffy", "colour", "white" };
String generatedSql = generateSql(parametersToValues);
int whereIndex = generatedSql.indexOf("WHERE");
for (String key, value : parametersAndValues) {
String fragment = String.format("%s = '%s'", key, value);
assertThat(generatedSql, containsString(fragment));
assertThat(whereIndex, is(lessThan(generatedSql.indexOf(fragment))));
}
但我们可以做的比这更简单。由于您实际上不必使用大量参数来测试它——对于大多数实现来说,只有三个重要的量,“无、一个或多个”——实际上可以根据所有可能的值对其进行测试:
String variation1 = "SELECT ... WHERE fur = 'fluffy' OR colour = 'white'";
String variation2 = "SELECT ... WHERE colour = 'white' OR fur = 'fluffy'";
assertThat(generatedSql, is(anyOf(variation1, variation2)));
编辑:为了避免手工编写所有可能的变化(如果你有两个或三个以上的项目,这会变得相当乏味,因为有n!组合n 个项目的方法),你可以看看生成所有可能排列的算法一个序列并执行以下操作:
List<List<String>> permutations = allPermutationsOf("fur = 'fluffy'",
"colour = 'white'", "scars = 'numerous'", "disposition = 'malignant'");
List<String> allSqlVariations = new ArrayList<>(permutations.size());
for (List<String> permutation : permutations) {
allSqlVariations.add("SELECT ... WHERE " + join(permutation, " OR "));
}
assertThat(generatedSql, is(anyOf(allSqlVariations)));