2013-01-21 43 views
0

我有这个简单的Java方法,用于测试来自JSF页面的输入。JSF验证器的JUnit测试

public void validateDC(FacesContext context, UIComponent component, Object value) throws ValidatorException, SQLException 
    { 

     Double d; 
     String s = value.toString().trim(); 

     if (s.length() > 10) 
     { 
       throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, 
         " Value is too long! (18 digits max)", null)); 
     } 

     try 
     { 
      d = Double.parseDouble(s); 
      if (d < 0) 
      { 
       throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, 
         " '" + d + "' must be positive number!", null)); 
      } 
     } 
     catch(NumberFormatException nfe) { d = null; } 


     if (d != null) 
     { 


     } 
     else 
     { 
      throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, 
         s.isEmpty() ? " This field cannot be empty!" : " '" + s + "' is not a number!", null)); 
     } 

    } 

我很感兴趣如何为此验证器编写JUnit测试?我可以简单地调用它并传递参数,但没有返回值。什么是可能的解决方案?

+0

验证方法的一般合同在[Validator javadoc](http://docs.oracle.com/javaee/6/api/javax/faces/validator/Validator.html)中有描述。 – McDowell

回答

2

如果使用的是JUnit4,您可以使用此:

@Test(expected=ValidatorException.class) 
public void testValidatorException() { 
//call to trigger the exception 
validateDC(...); 
} 
+0

+1或甚至更好ExpectedException –

0

下面是一些样品我写给你如何可以测试你的方法的简单的想法。

@Test(expected = ValidatorException.class) 
    public void shouldThrowExceptionWhenValueLengthIsGreaterThan10() throws Exception { 
    Validaor validaor = new Validator(); 

    FacesContext context; 
    UIComponent component; 
    Object value;// <-- I don't know what value exactly is. But you have to create one with length less than 10 of its toString() value 
    validaor.validateDC(context,component,value); 

    } 




    @Test 
    public void shouldNotThrowExceptionWhenValueLengthIsLessThan10() throws Exception { 
    Validaor validaor = new Validator(); 

    FacesContext context; 
    UIComponent component; 
    Object value;// create object with length more than 10 chars to of its toString() value 
    validaor.validateDC(context,component,value); 

    } 

希望这有帮助。

+0

您不能通过代码摘录告诉方法的名称不是那么明显。为什么这个例外的名字不太好? ValidationException确实告诉它是一个验证错误。你想要什么?这是一个带有额外信息的验证错误(值太长,必须是正数,...)。但是很好的例子,尽管已经在别人的第一个答案中给出了。 – roel

+0

在netbeans中,我得到导入错误。我导入了'import org.junit.Test; import sun.security.validator.ValidatorException;'但仍然需要导入其他包,因为我在这里得到错误'Validaor validaor = new Validator(); FacesContext上下文; UIComponent组件;' –

+0

@PeterPenzov不只是复制/粘贴代码,您应该阅读并理解它,同时也明白人们可能会犯错误,比如写'Validaor'而不是'Validator'(注意** t **区别)。 –