Testy EJB za pomocą junit

0

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

       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("[email protected]");

        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.

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

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.

//wydmuszka
public mojaMetodaSerwisu( ...) {
return new MyEjbFreeService(persistenceContext, refToSomeOtherBean).myMethod(...);
}
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

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

albo

@Rollback(false)
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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1