如果我想测试输入是否有效,我如何使用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
}
答案 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
子类的例外,告诉输入不是预期的。