1
public class EmailValidator implements Validator {
    public void validate(FacesContext context, UIComponent arg1, Object value)
            throws ValidatorException {
        String email = (String) value;
        if (!email.contains("@")) {
            FacesMessage message = new FacesMessage();
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            message.setSummary(" Email is not valid.");
            message.setDetail(" Email is not valid.");
            context.addMessage("userForm:Email", message);
            throw new ValidatorException(message);

        }
    }

}
4

1 に答える 1

5

ここで何をテストしたいですか?働いている場合if (!email.contains("@"))は?これをユーザーの観点からテストする場合は、Seleniumなどとの統合またはGUIテストを行う必要があります。

電子メール検証の単体テストが必要な場合は、クラスでこれを行います。

public class EmailValidator implements Validator {
    public void validate(FacesContext context, UIComponent arg1, Object value)
            throws ValidatorException {
        String email = (String) value;
        if (!isValidEmail(email)) {
            FacesMessage message = new FacesMessage();
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            message.setSummary(" Email is not valid.");
            message.setDetail(" Email is not valid.");
            context.addMessage("userForm:Email", message);
            throw new ValidatorException(message);

        }
    }

   boolean isValidEmail(String emailAddress){
     // do your tests here...
   }
}

次に、次のようなテストクラスを作成します。

public class EmailValidatorTest {

  @Test
  public testIsValidEmail(){

    EmailValidator validator = new EmailValidator();

    Assert.assertTrue(validator.isValidEmail("foo@bar.com");
    Assert.assertFalse(validator.isValidEmail("aaa");
    // more assertions here...

  }
}

編集

そうですね、いわゆるモックオブジェクトを提供することで、そのメソッドのテストを書くことができます。次に、指定された電子メールアドレスが無効な場合に例外が発生することを期待します。

public class EmailValidatorTest{

  @Test
  public void testValidateWithValidAddresses(){
    FacesContextMock facesContextMock = new FacesContextMock();
    EmailValidator validator = new EmailValidator();
    validator.validate(facesContextMock, null, "foo@bar.com");
  }

  @Test(expected=ValidatorException.class)
  public void testValidateWithInvalidAddresses(){
    FacesContextMock facesContextMock = new FacesContextMock();
    EmailValidator validator = new EmailValidator();
    validator.validate(facesContextMock, null, "foo");
  }   
}

FacesContextMockは、何もせずにFacesContextメソッドを実装する単なるモックアップです。

public class FacesContextMock extends FacesContext{
  @Override
  public Application getApplication(){
    return null; 
  }

  // all the abstract methods implemented here, just doing nothing
}

とはいえ、100%のコードカバレッジに近づけるためだけに、すべてのテストケースを作成する必要はないと思います。何をテストする必要があり、どの程度のコードカバレッジが必要かについては、https://sqa.stackexchange.com/で詳しく説明されていると思います。

于 2012-07-23T10:33:12.973 に答える