使用作为参数传递的集合的元素填充HashMap

时间:2017-05-28 14:19:50

标签: java unit-testing hashmap hashset

我必须写下这个方法:

    public Map<Robot, Integer> PickedUpForEachRobot(Set<Stuff> pickedUp) 

必须遍历作为参数传递的集合,并且必须计算每个机器人拾取的东西的数量并将其与其实例相关联。

我所做的就是:

public Map<Robot, Integer> PickedUpForEachRobot(Set<Stuff> pickedUp) {
    final Map<Robot,Integer> map = new HashMap<>();
    for(Stuff stuff : pickedUp){
        Integer quantity = map.get(stuff.getPicker());
        if(quantity!=null){
            map.put(stuff.getPicker(), quantity);
        }
    }
    return map;

}

我还有其他课程:

public class Stuff {

private Robot picker;

public Robot getPicker() {
    return this.picker;
}

}

public class Robot {

private Set<Stuff> bunchOfStuff;

public Set<Stuff> getBunchOfStuff() {
    return this.bunchOfStuff;
}

}

我试图合成,所以我希望无论如何我都能清楚。

所以我的问题是,当我对这个方法进行测试时:

@Test
public void testRaccoltoPerMezzo() {
    Statistics stats = new Statistics();
    Stuff stuff1 = new ball();
    Stuff stuff2 = new legoPiece();
    Set<Stuff> set = new HashSet<>();
    set.add(stuff1);
    assertEquals(1,set.size());
    Map<Robot,Integer> map = new HashMap<>();
    map.put(stuff1.getPicker(),1);

    assertEquals(map, stats.PickedUpForEachRobot(set));

}

它失败了,它对我说:

java.lang.AssertionError: expected:<{null=1}> but was:<{}>

我无法理解为什么。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:1)

此消息:

  

java.lang.AssertionError:expected:&lt; {null = 1}&gt;但是:&lt; {}&gt;

表示您希望拥有一个地图,其中一个元素拥有null键并且具有相关值1,但您有一张空地图。

根据您的要求和实际地图,您创建的预期地图似乎不够。 关于在实现中填充地图,我至少注意到这一点根本不符合逻辑。

这里:

final Map<Robot,Integer> map = new HashMap<>();
for(Stuff stuff : pickedUp){
    Integer quantity = map.get(stuff.getPicker());
    if(quantity!=null){
        map.put(stuff.getPicker(), quantity);
    }
}
当您从空地图Integer quantity = map.get(stuff.getPicker());获取数量时,

null始终会将数量估值为map = new HashMap<>();,并且仅当数量不是null时填充地图:

if(quantity!=null){
      map.put(stuff.getPicker(), quantity);
 }

但是地图是空的,它永远不会发生:所以你永远不会填充地图。

您可能在代码中遇到了其他问题,但我希望它能帮助您重新修改逻辑。