2012-01-02 11 views
7

Chcę przetestować mój kontroler mvc wiosny.W jaki sposób używasz wtrysku sprężyny do testowania jednostki kontrolera?

Sterownik posiada usługę:

@Autowired 
UserService userService 

A mój serwis użytkownika zależy (autowired) moja UserDao i inne usługi, takie jak MongoDB itp

Teraz chcę logika biznesowa być badane w my UserService, ale oczywiście chciałbym kpić z odpowiedzi z mojego UserDao i Mongodb itp.

Jak poprawnie skonfigurować test jednostki?

Czy mogę ponownie użyć pliku xml kontenera ze sprężyną, który ma wszystkie moje fasolki itp. Lub czy mogę utworzyć nowy? (Zakładam, że muszę wziąć tutaj udział pojemnik sprężyny)

Szukasz wskazówek na ten temat, wszelkie tutoriale byłyby bardzo mile widziane.

Aktualizacja

Co znajdę dziwne jest to, że dla mojego kontrolera sprężyny (który nie realizuje od kontrolera) byłem w stanie uzyskać dostęp do mojej prywatnej varialbe ręcznie ustawić moją usługę, a mianowicie:

@Controller 
public class UserController { 

    @Autowired 
    UserService userService; 
} 

I w moim badanej jednostki mogłem zrobić:

UserController controller = new UserController(); 
controller.userService = .... 

Ale dla mojego UserService, który ma UserDao autowired, nie mogę uzyskać dostępu Właściwość userDao:

UserService userService = new UserServiceImpl(); 
userService.userDao = .... // not available 

Ma to sens, ponieważ jest prywatne, ale jak to działa dla mojego kontrolera?

+1

Odp: zaktualizuj, jakie pakiety są kontrolerem, usługą i testami? Jeśli test jest w tym samym pakiecie, może uzyskać dostęp do właściwości o domyślnym zakresie. Pominięcie modyfikatora dostępu * nie * powoduje, że właściwość jest prywatna, raczej [pakiet-prywatny] (http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html). –

+0

Mam je w tej samej paczce. Ach, rozumiem, założyłem, że to było prywatne. Zastanawiam się, dlaczego IntelliJ podczas refaktora domyślnie tworzy pola prywatne. Więc powinienem zachować je jako pakiet prywatny? – Blankman

+1

Nie ma "powinien", to po prostu zależy. Moja jedyna troska związana z pakietami prywatnymi polega na tym, że nadal możesz uzyskać dostęp do czegoś nieumyślnie; Wolę zachować prywatność i używać seterów, ale meh. –

Odpowiedz

5

Wiosenne ramy mają bardzo interesujące funkcje do testowania. Możesz spojrzeć na Spring reference guide. Może zapewnić DI nawet w klasie testowej JUnit.

@RunWith(SpringJUnit4ClassRunner.class) 
// ApplicationContext will be loaded from "/applicationContext.xml" and "/applicationContext-test.xml" 
// in the root of the classpath 
@ContextConfiguration(locations={"/applicationContext.xml", "/applicationContext-test.xml"}) 
public class MyTest { 
    // class body... 
} 

skrócie, można użyć własnego applicationContext.xml lub nawet zdefiniować nowy tylko do testów. Osobiście używam innego, ponieważ definiuję inne źródło danych przeznaczone do testowania.

4

Co znajdę dziwne jest to, że dla mojego kontrolera sprężyny (który nie realizuje od kontrolera) byłem w stanie uzyskać dostęp do mojej prywatnej varialbe ręcznie ustawić moją usługę, a mianowicie:

To jest łatwe : zmienna nie jest prywatna.

Ma domyślną widoczność ("pakiet prywatny"). Oznacza to, że możesz uzyskać do nich dostęp ze wszystkich klas tego samego pakietu.

Więc jeśli masz wspólną strukturę, to kontroler i kontrolna skrzynka kontrolna znajdują się w tym samym pakiecie. Dlatego możesz modyfikować pola kontrolne ("pakiet prywatny"). Jednak przypadek testowy kontrolera i usługa nie są w tym samym pakiecie, więc nie można uzyskać dostępu do pól usługi ("pakiet prywatny").

1

mogę ponownie użyć pliku xml kontenera sprężyny, która ma wszystkie moje fasoli itd. Lub utworzyć nowy? (Zakładam, że muszę zaangażować tutaj kontener ze sprężyną )

Poradziłabym, aby utworzyć nowy plik xml. Kończy się powielanie wielu rzeczy i trudno będzie je utrzymać. Nastąpiłoby rozprzestrzenianie się plików konfiguracyjnych. Umieszczasz konfigurację wymaganą do testów w innym pliku XML, który nie powinien nawet zostać wdrożony w twoim polu produkcyjnym. O ile używasz konfiguracji dla twoich ziaren, możesz użyć mechanizmu sugerowanego przez @Trein.

Do testowania w skrócie spring compller można również znaleźć ten SO Thread.

Nadzieję, że pomaga.

Powiązane problemy