2010-09-15 21 views
7

Pracuję nad aplikacją Java EE 6. Kiedy zaczynałem, pisałem testy dla moich klas EJB przez ręczne tworzenie instancji EJB, a następnie ręczne dodawanie członków, które zwykle są dostarczane przez wstrzyknięcie zależności. Ponieważ aplikacja staje się bardziej skomplikowana, stwierdzam, że takie podejście po prostu jej nie ogranicza. Chciałbym móc uruchomić własny kontener EJB w strukturze testowej, aby mógł zarządzać moimi komponentami bean. Jaki jest najlepszy sposób podejścia do tego? Słyszałem o javax.ejb.embeddable.EJBContainer, czy są inne opcje?Strategie testowania EJB?

(Używam GlassFish 3 i budynek z Maven, jeśli czyni żadnej różnicy.)

Odpowiedz

2

Co dokładnie testujesz? Logika? Konfiguracja? Czy POTRZEBUJESZ bezpośrednio przetestować klasy EJB? Czy wystarczyłoby, aby twoje testy zachowywały się jak klient EJB na uruchomionym kontenerze? (Pamiętaj, że nie ma reguły, która mówi, że zautomatyzowane testy jednostkowe nie mogą wymagać działającego testu pod kontrolą systemu).

Jeśli chodzi o logikę biznesową, musisz przetestować, przenieść ten kod do POJO i testować normalnie; nie trzeba wówczas testować POJO uruchomionych w kontenerze, ponieważ kontener nie powinien wpływać na logikę biznesową.

W podobnej sytuacji nigdy bezpośrednio nie testowałem JUnit klasy serwletu lub klasy kontrolerów Struts. Zdecydowanie testuję POJO, od których zależą, i testuję aplikację końcową (działającą w kontenerze serwletów, przetestowaną z HtmlUnit), zakładając, że jeśli aplikacja końcowa działa, to działa również instalacja hydrauliczna.

+0

Oczywiście testowanie POJO jest łatwiejsze. Ale nie mogę przenieść całej logiki z moich EJB i na niezależne klasy - gdybym mógł to zrobić, nie używałbym EJB w pierwszej kolejności. Działanie jako klient EJB na uruchomionym kontenerze jest dobrym opisem tego, co próbuję zrobić, próbuję po prostu znaleźć najlepszy sposób, aby to osiągnąć. –

+0

Myślę, że miałeś rację, jeśli chodzi o testowanie wdrożonej aplikacji. Starałem się, aby EJBContainer pracował dla mnie (używając implementacji Glassfish-embedded), przeskoczył przez wiele kółek, aby uporać się z pracą, a następnie w końcu, gdy zorientowałem się, że usługa timera EJB (od której zależy moja aplikacja w kilku miejscach) nie został dostarczony. Zdałem sobie sprawę, że nawet jeśli uda mi się zbudować jakiś silnik do uruchomienia moich EJB-ów, to nigdy nie powieliłbym WSZYSTKICH warunków w prawdziwym pojemniku, więc byłby to bezużyteczny test. –

+4

'Pamiętaj, że nie ma żadnej zasady, która mówi, że zautomatyzowane testy jednostkowe nie mogą wymagać działającego testowanego systemu. No cóż, tak naprawdę istnieją reguły, a takie testy nie są testami jednostkowymi, z definicji :) –

0

Nie jestem do końca pewien, czy to pomaga przypadek, ale spojrzeć na Smokestack. Osobiście nie pracuję w przestrzeni EE (poza specyfikacją Servlet), ale w pewnym momencie zobaczyłem prezentację i wygląda na to, że może zrobić to, czego potrzebujesz.

2

Słyszałem o javax.ejb.embeddable.EJBContainer, czy są inne opcje?

Interfejs API EJBContainer jest opcją. Drugim byłoby użycie Arquillian (i SchrinkWrap).

Niektórzy więcej linków:

+0

Arquillian wygląda całkiem nieźle, ale wydaje się, że nie zapewnia usługi timera EJB, więc w moim przypadku miałoby to ograniczone narzędzie. Zobacz także moją odpowiedź na Rodneya. –

+0

@Mike Czy jesteś pewny, że * osadzony w szklanym naczyniu nie zapewnia usługi timera EJB? AFAIK, zatopiony rybik jest "prawdziwym" pojemnikiem. –

+0

Wygląda na to, że powinno być dostępne, ale kiedy używałem go przez interfejs API EJBContainer, otrzymałem komunikat o błędzie, że usługa timera jest niedostępna. Nie mogłem znaleźć żadnej istotnej dokumentacji, z wyjątkiem jednego krótkiego ogłoszenia na forum mówiącego, że emulator glassfish-embedded nie ma usługi timera. Może istnieć sposób, żeby to zadziałało, ale nie mam czasu, aby to rozgryźć i mogę uzyskać to, czego potrzebuję w inny sposób. –

0

Teraz nie Arquillian deweloperzy nie ma potrzeby bawić się wokół z wbudowanymi pojemnikach Java EE już.