2015-01-06 46 views
2

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

要调用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

什么是'setAge'认为如果给予无效的输入呢?一旦你知道了,你可以测试它。 –

+0

在这种情况下,不是测试你的'setAge'方法,最好是测试你的输入处理和转换方法,因为如果参数是一个int,它不应该编译 – Abbath

+1

你可以使用@Pattern注释,然后 使用hibernate验证器验证 - validator.validate(p); – panagdu

回答

0

这取决于你如何声明你的setAge方法。在你提到看来情况下,你宣布它是这样的:

public void setAge(String s) 

,但如果你有兴趣只是接收有效数字,为什么你接受摆在首位String

无论如何,假设您的setAge的声明是您因某种原因而做出的声明,那么我已经完成这项工作的方式是通过检查是否在违反我的逻辑的行中引发异常。所以,如果抛出异常,我继续进行其他检查,但如果不抛出,则setAge中的某些内容会变得不正确,并且会使测试失败。

我的建议是你声明setAge只接收数字(int也许),然后编译器会避免你的方法的几个无效使用。如果您收到一些无效号码,比如说-1,那么您会抛出RuntimeException其中一个子类的异常,告知输入不是预期的。

+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

如果你有ň条件你想在一个测试来表达,您有n测试。

现在,如果您的方法写入正确(即只接受int作为参数),那么您不需要测试该方法; Java会在编译时通知你你的错误。

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

  • 如果您接受String,你也很难期望它是一个整数(即“123”,而不是“123.2”),然后利用Integer#parseInt和弹了出来,当你得到一个IllegalArgumentException。测试这个异常是否被抛出。

    @Test(exception=IllegalArgumentException) 
    public void testSetAgeWithInvalidNumeralString { 
        // exercise your code 
    } 
    
  • 如果您接受int,那么你可能想要做边界检查。你会总是得到一个int在那里,所以你不妨找一些更有价值的验证。