Хорошие шаблоны для модульного тестирования форм-бинов с проверкой на основе аннотаций в Spring MVC - PullRequest
11 голосов
/ 01 марта 2012

При использовании проверки на основе аннотаций для bean-компонента формы, какова лучшая практика для модульного тестирования этих bean-компонентов, чтобы гарантировать, что для каждого поля указаны правильные аннотации проверки?

Например, если у вас есть:

public class MyForm {
    @NotNull
    private String name;
}

Каков наилучший способ убедиться, что к нему применяется @NotNull?

Один из очевидных способов - создать валидатор, выдать ему нулевое значение и ожидать, что онпотерпеть поражение.Но, на мой взгляд, это не лучший способ, так как вы будете тестировать поведение и реализацию @NotNull, используя это, а не доверяя фреймворку.

В идеале я хотел бы использовать отражение или утилиту, которая даетМне предоставляется возможность просто утверждать, что @NotNull (и любая другая) проверка применяется к данному полю, вместо того, чтобы отправлять различные комбинации значений, которые не проходят проверку.

Существует ли элегантный способ выполненияэто или я на правильном пути вообще?

Ответы [ 4 ]

5 голосов
/ 01 марта 2012

Две вещи, которые вы должны учитывать:

Не тестируйте сторонние библиотеки / фреймворки.

Вы должны полагаться на них, они должны быть уже протестированыих сопровождающими и окружающим сообществом.Вы не проверяете их, вы скорее оцениваете их.Чтобы убедиться, что они соответствуют вашим потребностям и минимизируют риски.

На самом деле важно тестировать поведение!

В подавляющем большинстве приложений мало места дляРеальное UNIT тестирование, поскольку бизнес-логика либо мала, широко распространено в нескольких модулях приложения.Поэтому вы должны рассмотреть интеграционное тестирование с тем же приоритетом, что и модульное тестирование.И это легче понять, используя поведенческий подход.

Итак, чтобы ответить на ваш вопрос, вам не следует пытаться вообще тестировать компонент формы.Это просто транспортный объект.Вам следует проверить, как получатель реагирует на эту форму, и проверить как нормальный, так и граничный случаи.

4 голосов
/ 01 марта 2012

Вы также можете написать модульные тесты для ваших Бинов, которые аннотированы с помощью JSR303 с использованием фабрики валидаторов. Смотрите пример: http://musingsofaprogrammingaddict.blogspot.com/2009/02/using-bean-validation-with-spring.html

3 голосов
/ 01 марта 2012

Вы можете проверить это легко.

Допустим, вы используете Hibernate Validator.Более или менее, это должно быть что-то вроде этого

    import javax.validation.ConstraintViolation;
    import junit.framework.Assert;
    import org.hibernate.validator.HibernateValidator;
    import org.junit.Before;
    import org.junit.Test;
    import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;

 private LocalValidatorFactoryBean localValidatorFactory;


@Before
public void setup() {
    localValidatorFactory = new LocalValidatorFactoryBean();
    localValidatorFactory.setProviderClass(HibernateValidator.class);
    localValidatorFactory.afterPropertiesSet();
}

  @Test
  public void testNullValidationError() {
        final MyForm myForm= new MyForm ();
        myForm.setName(null);
        Set<ConstraintViolation<MyForm >> constraintViolations =      localValidatorFactory.validate(myForm);
        Assert.assertTrue("Your error message", constraintViolations.notNull == null);
    }
2 голосов
/ 01 марта 2012

Мы тестируем аннотации для свойств bean-компонентов в рамках интеграционного тестирования между нашим уровнем представления и контейнером Spring.

Что мы делаем, это создаем поддельные MockPortletContext, DispatcherPortlet и MockRequests (эти классы являются частью библиотеки spring-test), заполните запросы, чтобы они выглядели так, как будто настоящая форма была отправлена, а затем вызовите dispatcherPortlet. (у нас есть портлетная среда, но это не имеет значения)

Затем вы можете проверить, что ваш бэкэнд был вызван надлежащим образом или что ответ содержит результат привязки с ожидаемыми ошибками проверки, что вам нужно.

...