2012-03-01 10 views
11

Podczas korzystania z sprawdzania poprawności opartej na adnotacjach dla komponentu bean formularza, jaka jest najlepsza praktyka testowania jednostkowego tych komponentów, aby zapewnić poprawność adnotacji sprawdzania poprawności dla każdego pola?Dobre wzorce do testowania jednostkowego ziaren z weryfikacją opartą na adnotacjach w Spring MVC

Na przykład, jeśli masz:

public class MyForm { 
    @NotNull 
    private String name; 
} 

Jaki jest najlepszy sposób, aby sprawdzić, @NotNull stosuje się do niego?

Oczywistym sposobem jest stworzenie walidator, rzucać null na niego i oczekiwać, że się nie powiedzie. Ale moim zdaniem to nie jest najlepszy sposób jak będziesz badania zachowań i wdrożenie @NotNull użyciu że zamiast ufać ramy.

Idealnie chciałbym użyć refleksji lub narzędzia, które daje mi możliwość stwierdzenia, że ​​walidacja @NotNull (i każdej innej) jest stosowana do danego pola, zamiast wysyłać różne kombinacje wartości, które nie sprawdzają poprawności .

Czy istnieje elegancki sposób to zrobić, czy jestem na dobrej drodze w ogóle?

Odpowiedz

4

Możesz również napisać testy jednostkowe dla swojej fasoli, które są opisane w JSR303 przy użyciu fabryki walidatorów. Zobacz przykład: http://musingsofaprogrammingaddict.blogspot.com/2009/02/using-bean-validation-with-spring.html

+0

Dziękuję. Główny artykuł w poście to robienie tego tak, jak chcę tego uniknąć. Istnieje jednak komentarz do tego posta (z gunnar), który robi to tak, jak miałem nadzieję - sprawdzając adnotację, a nie zachowanie adnotacji. –

+2

W ramach odpowiedzi należy dodać obowiązkowe części połączonego artykułu, aby zapobiec utracie informacji, jeśli strona przejdzie w tryb offline. – CSchulz

5

Dwie rzeczy, które należy wziąć pod uwagę:

nie testują swoich TRZECIĄ libraries/ram.

Należy opierać się na nich, oni mają być już przetestowany przez swoich opiekunów i otaczającej wykorzystania społeczności. Nie je przetestować, czy raczej ocenić im. Aby upewnić się, że odpowiadają one Twoim potrzebom i zmniejszyć ryzyko.

zachowanie Testowanie jest co sprawa, naprawdę!

W ogromnej większości zastosowań jest mało miejsca na rzeczywiste testowanie JEDNOSTKI, ponieważ logika biznesowa jest niewielka, są one rozpowszechnione w wielu modułach aplikacji. Dlatego powinieneś rozważyć testowanie integracji z tym samym priorytetem, co testowanie jednostkowe. Łatwiej jest to uchwycić, stosując podejście behawioralne.

Tak więc, aby odpowiedzieć na twoje pytanie, nie powinieneś próbować testować komponentu bean w ogóle. To tylko obiekt transportowy. To, co powinieneś przetestować, to jak odbiornik reaguje z tym formularzem i sprawdza zarówno przypadek normalny, jak i brzegowy.

+2

nie zgadzam się z testowania biblioteki osób trzecich, jednak badania konfiguracja jest równie ważne jak zachowanie testowania. –

+0

Tak, to jest dobra uwaga i zgadzam się z tym. Jednak myślę (jak mówi frant.hartm), że jest miejsce na testowanie konfiguracji. Cała reszta (tj. Aktualna walidacja) nie ma nic wspólnego z komponentem bean i nie powinna być tutaj testowana. –

+1

+1 dla "Więc powinieneś rozważyć testowanie integracji z tym samym priorytetem niż testowanie jednostkowe." – artbristol

2

Testujemy adnotacje o właściwościach fasoli w ramach testów integracyjnych między naszą warstwą prezentacji a pojemnikiem sprężynowym.

Co możemy zrobić, to stworzyć fałszywy MockPortletContext, DispatcherPortlet i MockRequests (te zajęcia są częścią biblioteki wiosna-test), wypełnić żądania tak, że wyglądają jak prawdziwa forma została zgłosił, a następnie wywołać dispatcherPortlet. (mamy środowisko portletowe, ale to nie ma znaczenia)

Następnie możesz sprawdzić, czy twój backend został nazwany prawidłowo lub czy odpowiedź zawiera wynik wiązania z oczekiwanymi błędami walidacji, czego potrzebujesz.

2

Możesz to łatwo przetestować.

Załóżmy, że korzystasz z weryfikatora hibernacji. Mniej więcej, powinno być coś takiego

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); 
    } 
+0

Nie, tego właśnie chcę uniknąć w teście jednostkowym dla fasoli, jak wyjaśniono w oryginalnym poście i następnych krokach. –

Powiązane problemy