为什么我的代码未能通过JUnit对IllegalArgumentException的测试?

时间:2019-09-16 15:00:42

标签: java

我被要求实现一种称为setLevel的方法。我还需要在MIN和MAX值之间抛出IllegalArgumentException(),这是我从上一个称为Hounsfield的类中获取的。它已连接到JUnit测试器,并且我通过了大多数测试,除了下面发布的测试之外,我不明白为什么。第一块代码是我的代码,第二块代码是失败的JUnit测试的代码。具体来说,行失败是“ fail(String.format(“新的HounsfieldWindow(%s,10)应该抛出异常”,级别))”。

编辑:我也将所有代码添加到了setLevel方法中。

public class HounsfieldWindow {
private int level, width;

public HounsfieldWindow(int level, int width) {
    this.level = level;
    this.width = width;
}

public HounsfieldWindow() {
    this(0, 400); 
}

public int getLevel() {
    return level;
}

public int setLevel(int level) {
    if (level < Hounsfield.MIN_VALUE || level > Hounsfield.MAX_VALUE) {
        throw new IllegalArgumentException();
    }
    int data = this.level;
    this.level = level;
    return data;
}


@Test
public void test04_ctorThrowsOnBadLevel() {
    final int[] BAD_LEVELS = { -10000, -1025, 3072, 9999 };
    for (int level : BAD_LEVELS) {
        try {
            new HounsfieldWindow(level, 10);
            fail(String.format("new HounsfieldWindow(%s, 10) should throw an exception", level));
        } catch (IllegalArgumentException x) {
            // ok
        }
    }
}

2 个答案:

答案 0 :(得分:0)

您的单元测试实际上并未测试您声称的方法。看起来您的构造函数实际上应该在调用set level方法。就目前而言,构造函数可以在设置级别方法中定义的可接受参数之外设置级别,这似乎不是您想要的。

对构造函数的以下更改将修复您的测试。

public HounsfieldWindow(int level, int width) {
    setLevel(level);
    this.width = width;
}

答案 1 :(得分:-1)

您必须将fail语句放在catch块中