我有以下方法返回列表中最常出现的值
public Integer notaFrecventaMaxima() {
if (note.size() == 0) {
return null;
} else {
Map<Integer, Integer> frecventaNote = new HashMap();
for (Integer nota : this.note) {
Integer frecventaNota = frecventaNote.get(nota);
frecventaNote.put(nota, frecventaNota == null ? 1 : frecventaNota+1);
}
Entry<Integer, Integer> max = null;
for (Entry<Integer, Integer> entry : frecventaNote.entrySet()) {
if (max == null || entry.getValue() > max.getValue()) {
max = entry;
}
}
Integer maxValue = max.getValue();
int returnNota = frecventaNote.entrySet().stream().filter(entry -> entry.getValue() == maxValue)
.map(entry -> entry.getKey()).max(Comparator.naturalOrder()).get();
return returnNota;
}
}
我需要对此方法进行反向关系junit测试,但我不知道它是如何可能的。你能给我任何想法吗?
答案 0 :(得分:0)
此方法中的所有计算(最终)都基于
for (Integer nota : this.note) {
提供&#34;输入数据&#34;。
换句话说:您的测试类似乎包含一个带有Integer对象的数组/列表/ ...该数据用于创建HashMap并进行计算;这将导致(最终)作为单个整数值。
因此,测试实际上非常简单:您可以在测试中创建类的不同对象,然后推送&#34;不同的&#34;值为note
。
然后你调用那个方法;并取决于您对每个输入集的期望结果;你只是断言回到你身边的价值是预期的价值:
@Test
public void testCasaUno() {
Whatever underTest = new Whatever(Arrays.asList(1, 2, 3, 4));
assertThat(underTest.notaFrecventaMaxima(), is(42));
}
当然:编写这样的测试可能会很棘手,因为你有&#34;计算&#34;手动输入某个输入的预期结果。这是很多工作。
我宁愿建议您通过将其分解为更多方法来提高生产代码的质量。示例:您可以将该Map的创建+设置移动到其自己的方法中。而现在......你可以自己测试这个方法,更容易:这里列表进入,只需检查传出的地图是否像你期望的那样。
等等......经常这样:您的生产代码越多,#34;清洁代码&#34;规则;测试越容易。