为什么我的j-unit测试hashmap返回'期望空指针异常'?

时间:2014-07-15 20:59:42

标签: java unit-testing constructor hashmap logic

我想假设使用哈希映射制作直方图。我们要构建一些junit测试,但我的测试返回null。它与在ArrayList中测试空字符串有什么不同? 我的前两个测试应该是期待一个非法的论证,但即使那些失败.. 通常我们创建该类的新对象并测试其上的方法但是当我创建直方图对象时,我无法将其与逻辑上的hashmap或测试相关联。我多次进行了j单元测试,但我在这里为哈希地图绘制了一个空白,因为它是我第一次使用它。有什么建议吗? thx提前。

 public class Histogram{

 private HashMap<String, Integer> map;

/**
 * constructor for Histogram
 * 
 * @precondition map cannot contain null or empty string values
 * @postcondition sets map to new Hashmap
 * @param none
 * 
 */
public Histogram() {

   if ((this.map.containsValue("") || this.map.containsKey(null)) {
        throw new IllegalArgumentException(
                "there cannot be an empty string an String cannot be null");
    }
    this.map = new HashMap<String, Integer>();
}
/**
 * attempts to find the parameter in map.
 * 
 * @param add
 *            the string to find
 * 
 */
    public void add(String add) {
    for (int count = 1; count >= 1; count++) {
        if (this.map.containsKey(add)) {
            count++;
        }
        if (!this.map.containsKey(add)) {
            this.map.put(add, 1);
        }
    }
}

/**
 * finds the count associated with the parameter and returns it.
 * 
 * @param count
 *            the count/number relevant to the key in the hashmap
 * @return countb, the count converted into a integer
 */
public int getCount(String count) {
    this.map.get(count);
    int countb = Integer.parseInt(count);
    if (!this.map.containsKey(count)) {
        return 0;
    } else {
        return countb;
    }
}

/**
 * sorts the words in the list returned
 * 
 * @return keys a sorted list of keys in the hashmap maps
 */
public ArrayList<String> getSortedKeys() {
    ArrayList<String> keys = null;
    keys = new ArrayList<String>(this.map.keySet());
    Collections.sort(keys);
    return keys;

}


j uint testing class

public class WhenAddingToHistogram {

private HashMap<String, Integer> map;

/**
 * test for adding an empty string
 */
@Test
(expected = IllegalArgumentException.class)
public void testForAddingemptyString() {
    this.map = new HashMap<String, Integer>();
    //Histogram database   = new Histogram();

    this.map.put("kassy", 1);
    this.map.put("sid", 2);
    this.map.put("", 3);
    assertEquals(this.map.containsKey(""),true);
}


/**
 * test for adding an empty string
 */
@Test
(expected = IllegalArgumentException.class)
public void testForAddingNullString() {
    this.map = new HashMap<String, Integer>();
    //Histogram database   = new Histogram();

    this.map.put("kassy", 1);
    this.map.put("sid", 2);
    this.map.put(null, 3);
    assertEquals(this.map.get(null), true);
}

/**
 * test if hash map contains key
 */
@Test
// (expected = IllegalArgumentException.class)
public void testForcontainskey() {
    this.map = new HashMap<String, Integer>();
    this.map.put("kassy", 1);
    assertEquals(this.map.get("kassy"), 1 , 0);
}

/**
 * test is hash map does not contain key
 */
@Test
//(expected = IllegalArgumentException.class)
public void testFornotcontainskey() {
    this.map = new HashMap<String, Integer>();
    this.map.put("kassy", 1);
    this.map.put("joe",  2);
    assertEquals(this.map.containsKey("john"), false);
}

2 个答案:

答案 0 :(得分:1)

此逻辑错位和/或不正确:

if ((this.map.containsValue("") || this.map.containsKey(null)) {
    throw new IllegalArgumentException(
            "there cannot be an empty string an String cannot be null");
}

如果要确保没有空键插入到地图中,则应该在调用方法中将数据放入直方图中。这使得完整性检查没有实际意义,因为null中没有Map或空字符串。

实例化地图实例之前,您正在运行上述逻辑。当您运行上述逻辑时,它将在实例化时点null。如果你直接在字段中直接实例化它会更好:

map = new HashMap<>();

答案 1 :(得分:-1)

我认为这里的问题相当微妙。

在JUnit中测试布尔条件的常用方法是(我相信),可以调用assertTrueassertFalse。但是,你正在做的是调用assertEquals,based on the documentation,对于布尔值,只是对象和一些其他原语没有重载。

为什么这很重要?

Java做了一些名为autoboxing的事情。 。这样做的是,每当你给一个期望一个对象的方法提供一个原语时,Java会自动将该原语转换为一个Object包装器(ints被装入Integers,booleans进入Booleans等)。我相信在你的代码中,当你打电话时

assertEquals(this.map.containsKey("john"), false);

Java正在做的是将false值自动装箱到一个布尔对象中,然后尝试用第一个对象调用.equals。这可能是你的nullpointer的来源。