2012-02-10 15 views
31

Do testu jednostkowego potrzebuję wyśmiać kilka zależności. Jednym z zależnościami jest klasa, która implementuje interfejs:Kpiny z klasy a wyśmiewanie się z interfejsu

public class DataAccessImpl implements DataAccess { 
    ... 
} 

muszę założyć atrapa obiektu tej klasy, która zwraca niektórych określonych wartości, gdy wyposażony pewnych określonych parametrach.

Teraz, co nie jestem pewien, czy jest to lepiej mock interfejsu lub klasy, tj

DataAccess client = mock(DataAccess.class); 

vs.

DataAccess client = mock(DataAccessImpl.class); 

Czy ma żadnej różnicy w odniesieniu do testowania? Jakie byłoby preferowane podejście?

+1

Oto kilka innych przemyśleń na temat szyderczych zajęć. Nice read, imho: http://stackoverflow.com/questions/1595166/why-is-it-so-bad-to-mock-classes – guerda

Odpowiedz

38

Nie może to mieć większego wpływu na twoją sprawę, ale preferowane podejście polega na fałszywym interfejsie, ponieważ normalnie, jeśli postępujesz zgodnie z TDD (Test Driven Development), możesz napisać testy jednostek nawet przed napisaniem swoich klas implementacji. Dlatego nawet jeśli nie masz konkretnej klasy DataAccessImpl, nadal możesz pisać testy jednostkowe za pomocą interfejsu DataAccess.

Co więcej, szydercze frameworki mają ograniczenia w szykanowaniu klas, a niektóre frameworki domyślnie tylko symulują interfejsy.

6

To zależy. Jeśli twój kod zależy od klasy, a nie od interfejsu, musisz kpić z klasy, aby napisać poprawny test jednostkowy.

+13

Albo posłuchaj testu i spraw, aby kod był zależny od interfejsu, ponieważ prawdopodobnie powinien. – blank

6

W większości przypadków technicznie nie ma różnicy i możesz kpić jako klasa, więc interfejs. Koncepcyjnie lepiej jest korzystać z interfejsów z powodu lepszej abstrakcji.

2

Jeśli używasz go tylko poprzez interfejs i nie jest to częściowa sztuczka, nie ma żadnej różnicy poza twoimi wewnętrznymi odczuciami. Kpiny z klasy będą także kpić z nieużywanej metody publicznej, jeśli klasa je posiada, ale nie jest to wielka sprawa do rozważenia.

3

Powinieneś kpić z interfejsu, ponieważ pomoże ci upewnić się, że przestrzegasz zasady podstawiania Liskov (https://stackoverflow.com/a/56904/3571100).

+0

Byłoby interesujące wiedzieć, w jaki sposób można to osiągnąć, kpiąc z interfejsu? Mogę kpić z interfejsu, ale w implementacji klasowej mogę naruszyć zasadę Liskov Substitution. – karlihnos

+0

@karlihnos link podałem stany "Funkcje [...] muszą być w stanie używać obiektów klas pochodnych, nie wiedząc o tym." innymi słowy, powinniśmy zaprogramować interfejs, a nie implementację. Tak więc w testowanej klasie możemy pomóc osiągnąć LSP poprzez programowanie do interfejsu. Oczywiście robienie tego nie mówi nic o tym, czy jakiekolwiek wyśmiewane implementacje interfejsów będą zgodne z LSP, czy nie. – jordan

Powiązane problemy