在单元测试时,在哪里处理NullPointerException(在函数或构造函数中)

时间:2016-09-26 08:00:41

标签: java unit-testing

以下是我的问题的说明。我目前不知道处理NullPointerException的方法。

public class Util
{
   private Map<Integer, String> myMap;

  public Util(Map<Integer, String> myMap)
  {
     this.myMap = myMap;
  }

  public String getVal(Integer region)
  {
     return myMap.get(region);
  }
}


public class UtilTest {

  @Test
  public void testNull() throws Exception{
    Map<Integer, String> myMap = null;
    Util util = new Util(myMap);

    util.getValue(1);
  }
}

上面的代码将按预期给出NullPointerException。我关心的是我应该在构造函数或函数本身中处理它

在构造函数中如下

  public Util(Map<Integer, String> myMap)
  {
     if(myMap != null)
     this.myMap = myMap;
     else
     this.myMap = new Map<>();
  }

在功能上,它会与

类似
 public String getVal(Integer region)
 {
   if(myMap != null)
   return myMap.get(region);
   else
   return "";
 }

这些方法中哪一个更好,为什么我应该采用另一个?

3 个答案:

答案 0 :(得分:9)

它应该在Util类中,因为外部函数应该不了解Util类创建内部的内容。它可以发送任何无效/有效值。构造函数应确保正在妥善处理所有无效/有效值。

其他观点是 - 如果有n个地方创建了Util,那么你必须在所有那些n个地方写下if-else。最好只在构造函数中使用它。

答案 1 :(得分:1)

这是一个意见问题。 但是,由于您没有提供setter方法,我建议在构造函数中进行。

如果您打算稍后提供一个setter(如果当时输入不可用),可以在不检查构造函数的情况下离开。

最后,null可能是您的代码的有效输入,并且您可以在getter方法中检查它并自己抛出异常,而不是让系统抛出空指针。

我的想法,如果没有setter,那么从构造函数中抛出异常。不要让程序抛出空指针。

答案 2 :(得分:0)

我的意见无处可去!

如果有人打电话给new Util(null),他就是:

  • 编写与此类相关的测试代码的人,他明确地通过null,因为他正在测试不依赖于此Map的类的另一部分可以允许null(因为永远不会调用Map)。
  • 生产代码中使用此类的人,因为在生产中使用null是错误的,只需让代码稍后抛出NPE并让那些敢于使用的人null感受到后果(又称痛苦的调试)。