Хорошие шаблоны для модульной тестовой формы beans, которые имеют проверку на основе аннотаций в Spring MVC

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

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

public class MyForm {
    @NotNull
    private String name;
}

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

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

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

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

Ответ 2

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

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

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

Тестирование - это то, что важно, действительно!

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

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

Ответ 3

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

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

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

Ответ 4

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

Скажем, вы используете 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);
    }