Java 在JUnit中测试方法的合法和非法参数
如果我想测试输入是否有效,如何使用JUnit4来测试方法是否处理非法的输入/参数 要调用Java 在JUnit中测试方法的合法和非法参数,java,junit,junit4,Java,Junit,Junit4,如果我想测试输入是否有效,如何使用JUnit4来测试方法是否处理非法的输入/参数 要调用setAge()方法,参数必须是整数,而不是字符或字符串 @Test public void testWHetherInputValid() { Person p = new Person(); String s = "abc"; p.setAge(s); // but actually, the correct input must be an integer } 这取决于您如何声
setAge()
方法,参数必须是整数,而不是字符或字符串
@Test
public void testWHetherInputValid() {
Person p = new Person();
String s = "abc";
p.setAge(s); // but actually, the correct input must be an integer
}
这取决于您如何声明
设置
方法。在您提到的案例中,您似乎声明了如下内容:
public void setAge(String s)
但是,如果您只想接收有效的数字,那么首先为什么要接受字符串
无论如何,假设您的设置的声明是出于某种原因而准备的,我这样做的方式是检查是否在违反我的逻辑的行中抛出异常。因此,如果抛出异常,我将继续进行其他检查,但如果未抛出异常,则设置中出现问题,导致测试失败
我的建议是,您声明setAge
只接收数字(int
maybe),然后编译器将为您避免多次无效使用您的方法。如果您收到了一些无效的数字,比如说-1
,那么您将抛出RuntimeException
的一个子类的异常,告知输入不是预期的。如果设置
收到int
,编写一个将字符串
传递给它的测试毫无意义——这样的调用甚至不会编译
测试用于捕获编译器无法检测到的运行时错误。例如,假设一个人的年龄必须是正整数。例如,传递-1
应该会导致函数抛出IllegalArgumentException
,可以通过在@Test
注释中指定预期的异常来测试该异常:
@Test(expected = IllegalArgumentException.class)
public void testWHetherInputValid() {
Person p = new Person();
int invalidAge = -1;
p.setAge(invalidAge);
}
如果要在测试中表达n条件,则需要进行n测试
现在,如果您的方法编写正确(即,它只接受int
作为参数),那么您不需要测试它;Java将在编译时通知您错误
如果您接受其他类型的对象作为参数(亲爱的上帝,为什么?!),那么这取决于它是如何实现的
- 如果您接受
字符串
,并且您很难期望它是整数(即“123”而不是“123.2”),那么利用整数#parseInt
并在得到非法argumentException
时爆炸。测试是否引发此异常
@Test(exception=IllegalArgumentException)
public void testSetAgeWithInvalidNumeralString {
// exercise your code
}
- 如果接受
int
,则可能需要进行边界检查。您将始终在其中获得一个int
,因此您还可以找到更值得验证的内容
如果输入无效,设置应该怎么做?一旦你知道了这一点,你就可以对它进行测试。在这种情况下,与其测试你的setAge
方法,不如测试你的输入处理和转换方法,因为如果参数是int,它就不应该编译。你可以使用@Pattern注释,然后使用hibernate validator来验证-validator.validate(p);Java是强类型的,因此不能传递声明了字符串的int
。因此,如果Person#setAge
实际上是Person#setAge(int)
,您的代码甚至不会编译。编译器会告诉您他找不到Person\setAge(String)
方法。