2012-03-30 8 views
7

W poniższym kodzie problem polega na tym, że nie mogę przetestować dao.add() bez używania dao.list(). Size() i na odwrót.Jak przetestować "dodaj" w DAO bez użycia "znajdź" itp.?

Czy to podejście jest normalne czy niepoprawne? Jeśli jest niepoprawny, w jaki sposób można go poprawić?

public class ItemDaoTest { 

    // dao to test 
    @Autowired private ItemDao dao; 

    @Test 
    public void testAdd() { 
     // issue -> testing ADD but using LIST 

     int oldSize = dao.list().size(); 
     dao.add(new Item("stuff")); 
     assertTrue (oldSize < dao.list().size()); 
    } 

    @Test 
    public void testFind() { 
     // issue -> testing FIND but using ADD 

     Item item = new Item("stuff") 
     dao.add(item); 
     assertEquals(item, dao.find(item.getId())); 
    } 
} 
+0

Czy wykonujesz testy integracyjne lub jednostkowe? – davidfrancis

+0

Mówisz mi :) W tym konkretnym przypadku - używanie wyłącznie zdrowego rozsądku wydaje mi się bardziej podobne do testu integracji. Ale wiesz, w końcu chcę tylko upewnić się, że moje DAO działa, to wszystko. – Xorty

+0

Tak, to jest ból. Nie jesteś pewien, czy możesz skończyć z testami jednostkowymi z powodu zależności od dao. Jak działa dao? Osobiście starałbym się uniknąć uzależnienia twojego testu od zewnętrznej bazy danych i próbować odgadnąć lub pozorować warstwę dostępu do bazy danych, jak sugeruje jedna z odpowiedzi. Powiedziawszy, że to nigdy nie jest tak uspokajające jak prawdziwy test integracji zależny od db. – davidfrancis

Odpowiedz

2

Myślę, że twoje testy są ważnymi testami integracyjnymi, jak podano powyżej, ale użyłbym Adda do pomocy w testowaniu Find i vice wersetu. Na pewnym poziomie musisz pozwolić sobie na zaufanie do twojego najniższego poziomu integracji z zewnętrzną zależnością. Zdaję sobie sprawę, że w twoich testach istnieje zależność od innych metod, ale uważam, że metody Add and Find są metodami "niskiego poziomu", które są bardzo łatwe do zweryfikowania. Oni zasadniczo sprawdzają się nawzajem, ponieważ są to zasadniczo metody odwrotne.

dodawania można łatwo zbudować warunki do znalezienia

Find może sprawdzić, czy dodatek był udany.

Nie mogę myśleć o sytuacji, w której wystąpiła awaria albo nie będzie złowionych przez testu

0

Używam bezpośredniego JDBC (przy użyciu Spring JdbcTemplate) do testowania metod DAO. Mam na myśli wywołanie metod DAO (będących bazą Hibernate), a następnie potwierdzenie ich przy użyciu bezpośrednich wywołań SQL JDBC.

+1

Ale to oznacza dodawanie linii nieprzetestowanego kodu JDBC tylko ze względu na testowanie ...: | – Xorty

1

Twoja metoda testAdd ma problem: zależy to od założenia, że ​​ItemDao.list działa poprawnie, a mimo to ItemDao jest testowaną Klasą. Testy jednostkowe mają być niezależne, więc lepszym podejściem jest użycie zwykłego JDBC - jak powiedział @Amir - w celu sprawdzenia, czy rekord został wprowadzony do bazy danych.

Jeśli używasz Spring, możesz przekazać na AbstractTransactionalDataSourceSpringContextTests, aby uzyskać dostęp do obiektów JDBCTemplate i zapewnić wycofanie po wykonaniu testu.

0

Najmniejsza jednostka w ramach testu dla testów jednostkowych klasy oparte jest klasa.

Aby zobaczyć, dlaczego, możesz teoretycznie przetestować każdą metodę klasy w oderwaniu od wszystkich innych metod, pomijając, upuszczając lub kpiąc z nich. Niektóre narzędzia mogą tego nie obsługiwać; to nie jest praktyka, załóżmy, że tak.

Mimo to robienie rzeczy w ten sposób byłoby złym pomysłem. Specyfikacja pojedynczej funkcji będzie się różnić między niejasno bezsensownymi i gadatliwymi niezrozumiałymi. Tylko w przypadku interakcji między różnymi funkcjami istnieje specyfikacja prostsza niż kod, który można z zyskiem wykorzystać do przetestowania.

Jeśli dodasz przedmiot, a liczba zgłoszonych przedmiotów wzrośnie, rzeczy będą działać. Jeśli jest jakiś sposób, że rzeczy nie mogą działać, ale mimo to wszystkie wzorce interakcji trzymają się, to brakuje ci jakiegoś potrzebnego testu.

Powiązane problemy