测试JUnit中方法的合法和非法参数

时间:2015-01-06 21:57:17

标签: java junit junit4

如果我想测试输入是否有效,我如何使用JUnit4来测试该方法是否处理非法输入/参数?

要调用setAge()方法,参数必须是整数而不是char或string。

@Test
public void testWHetherInputValid() {
    Person p = new Person();
    String s = "abc";
    p.setAge(s); // but actually, the correct input must be an integer
}

3 个答案:

答案 0 :(得分:5)

如果setAge收到int,则编写一个将String传递给它的测试没有意义 - 这样的调用甚至不会编译。

测试用于捕获编译器无法检测的运行时错误。例如,假设Person的年龄必须是正整数。例如,传递-1会导致函数抛出IllegalArgumentException - 可以通过在@Test注释中指定预期的异常来测试:

@Test(expected = IllegalArgumentException.class)
public void testWHetherInputValid() {
    Person p = new Person();
    int invalidAge = -1;
    p.setAge(invalidAge);
}

答案 1 :(得分:1)

如果您想要在测试中表达 n 条件,则您有 n 测试。

现在,如果您的方法编写正确(也就是说,它只接受int作为参数),那么您不需要测试它; Java将在编译时通知您错误。

如果你接受其他类型的对象作为参数(亲爱的上帝为什么?!),那么它取决于它是如何实现的。

  • 如果你接受String,并且你很难期望它是一个整数(即“123”而不是“123.2”),那么利用Integer#parseInt并在你的时候轰炸获得IllegalArgumentException。测试抛出此异常。

    @Test(exception=IllegalArgumentException)
    public void testSetAgeWithInvalidNumeralString {
        // exercise your code
    }
    
  • 如果您接受int,那么您可能想要进行边界检查。你 总是 在那里获得int,所以你也可以找到更有价值的东西来验证。

答案 2 :(得分:0)

这取决于您如何声明setAge方法。在你提到的情况下,你似乎宣称它是:

public void setAge(String s)

但如果您对收到有效号码感兴趣,为什么首先接受String

无论如何,假设你setAge的声明是你出于某种原因的意图,我这样做的方法是检查是否在违反我的逻辑的行中抛出异常。因此,如果抛出异常,我会继续进行其他检查,但如果没有抛出,那么setAge中的某些内容就会变坏,我会让测试失败。

我的建议是,您声明setAge只接收数字(可能是int),然后编译器会避免对您的方法进行多次无效使用。如果你收到一些无效的号码,让我们说-1然后你抛出一个RuntimeException子类的例外,告诉输入不是预期的。