Testy EJB za pomocą junit

Testy EJB za pomocą junit
GypsyOne
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 6 lat
  • Postów:17
0

Hej, potrzebuje napisać testy jednostkowe klas Dao, do tej pory robiłem to po prostu w mainie w taki sposób:

Kopiuj
       InitialContext ic = new InitialContext();
        OfferRemote offerEjb = (OfferRemote) ic.lookup("java:global/ee-std-client-demo-ear/ee-std-client-demo-ejb-1.0/OfferDao");
        UserAccountRemote userEjb = (UserAccountRemote) ic.lookup("java:global/ee-std-client-demo-ear/ee-std-client-demo-ejb-1.0/UserAccountDao");
        AuctionRemote auctionEjb = (AuctionRemote) ic.lookup("java:global/ee-std-client-demo-ear/ee-std-client-demo-ejb-1.0/AuctionDao");

     /*   UserAccount user = new UserAccount();
        user.setUsername("filip");
        user.setEmail("example100@gmail.com");

        Offer offer = new Offer();
        offer.setPrice(2200d);
        Offer offer2 = new Offer();
        offer.setPrice(2500d);

        Auction auction = new Auction();
        auction.setDescription("opel na sprzedaz");
        auction.setPrice(2000d);
        auction.setTitle("opelek na sprzedaz");
        auction.addOffer(offer);
        auction.setExpirationTimestamp(new Timestamp(System.currentTimeMillis() - 86400000l));

        user.addOffer(offer, auction);
        user.addOffer(offer2, auction);

        user.addAuction(auction);

        userEjb.save(user);*/

ale myślę, żeby to zrobić elegancko przy pomocy Junita. Napisałem takie coś, ale funkcje, które normalnie działały w powyższym mainie nie dodają rzeczy do baz danych(czy w ogóle powinny to robić) i testy automatycznie nie zdają egzaminu.

Kopiuj
public class AuctionDaoUnitTest {

    private AuctionDao auctionDao = new AuctionDao();

    @Test
    public void saveTest() {
        Auction auction = new Auction();
        auction.setTitle("test");
        auction.setPrice(20d);
        auction.setDescription("cos na sprzedaz");
        auctionDao.save(auction);
        assertEquals(auction, auctionDao.findById(1l));
    }
}

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 22 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4708
2

Testowanie EJB to kiepucha. Formalnie jest rakie coś jak arquilian http://arquillian.org/guides/getting_started_rinse_and_repeat/, ale dużo czasu poświęca się na maintenance tego :/

Preferuje pattern tzw. Wydmuszka: cała logika napisana porządnie bez Ejb i CDI (lub springa w zależności co architekty wymyśliły) i to jest testowane(w osobnym module). Przeważnie z bazą danych in memory.
Potem moduł EJB to tylko fasady zbierające zależności i odpalające faktyczne, czyste implementacje. Tych fasad już nie testuje.

Kopiuj
//wydmuszka
public mojaMetodaSerwisu( ...) {
return new MyEjbFreeService(persistenceContext, refToSomeOtherBean).myMethod(...);
}

jeden i pół terabajta powinno wystarczyć każdemu
edytowany 4x, ostatnio: jarekr000000
PI
tworzenie instancji serwisu za pomocą new :D
jarekr000000
@Pinek jak ludzie. Przynajmniej zawsze działa.
vpiotr
Preferencje to jedno, ale widział ktoś w ogóle testy jednostkowe EJB? To integracyjne raczej? Po cholerę testować jednostkowo coś co zależy od bazy danych, serwera aplikacyjnego i może jeszcze JMS. Mam nadzieję że ten pomysł chociaż nie dotyczy fazy budowania aplikacji...
jarekczek
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Siemianowice Śląskie
  • Postów:500
0

Chyba był jakiś myk, że JPA w Junit domyślnie robi transakcje, które się nie zapisują. Jakoś się to przestawiało. Tu coś piszą o tym:
http://forum.spring.io/forum/spring-projects/data/53804-commit-transactions-running-springjunit4classrunner

Może coś w stylu

Kopiuj
@TransactionConfiguration(transactionManager="txMgr", defaultRollback=false)

albo

Kopiuj
@Rollback(false)

Przeważnie ignoruję niezarejestrowanych użytkowników.
jarekr000000
Ale to nie Spring.
W0
  • Rejestracja:ponad 12 lat
  • Ostatnio:około godziny
  • Postów:3597
0

Pytanie tylko - co ty tutaj testujesz?

Z tego co widzę to tworzysz jakieś obiekty, które potem zapisujesz w bazie danych przez EJB - i potem sprawdzasz, czy działają.

Jeśli twoja metoda to typowe "podaj dalej" (czyli userEJB.save(Account) składa się z userDAO.save(Account)) to po prostu nie widzę zbytniego powodu do pisania testów tego. Lepiej od razu zawołać userDAO. Problem się zaczyna, kiedy UserDAO korzysta z ServiceLocatora - wtedy po prostu sugeruję dopisać konstruktor UserDAO(EntityManager czy cokolwiek) i wstrzykiwać zależności oddzielnie.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.