junit中的反向关系测试

时间:2017-05-16 13:38:16

标签: java junit

我有以下方法返回列表中最常出现的值

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测试,但我不知道它是如何可能的。你能给我任何想法吗?

1 个答案:

答案 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;规则;测试越容易。