Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JUnit中测试方法的合法和非法参数_Java_Junit_Junit4 - Fatal编程技术网

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

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 } 这取决于您如何声

如果我想测试输入是否有效,如何使用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
}

这取决于您如何声明
设置
方法。在您提到的案例中,您似乎声明了如下内容:

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)
方法。