2012-05-17 9 views
16

AktualizacjaStatyczne klasy/metody/nieruchomość w badanej jednostki, zatrzymać lub nie

powinny statyczne klasy/metody/nieruchomość być stosowany w środowisku programistycznym testów jednostkowych, zważywszy, że nie sposób go przetestować bez wprowadzania owijki, której znowu nie można sprawdzić?

Innym scenariuszem jest to, że gdy statyczne elementy są używane w testowanym celu jednostki, nie można wyśmiewać statycznego mema. W związku z tym należy przetestować statyczne statystyki podczas testowania urządzenia testowanego przez jednostkę. Chcesz go wyizolować, gdy element statyczny wykonuje obliczenia.

Odpowiedz

32

Testing metoda statyczna nie jest inaczej niż jakąkolwiek inną metodę testowania uwzględniając metodę statyczną jako uzależnienia wewnątrz innego testowanego modułu stwarza problemy (.. jak już wspomniano - nie możesz oszukiwać/ogłaszać go za pomocą bezpłatnych narzędzi), ale jeśli sama statyczna metoda jest testowana jednostkowo, możesz po prostu treat it as working, reliable component.

Ogólnie rzecz biorąc, nie ma nic złego (jak w, nie zakłóca to testowanie jednostkowe/TDD) metodami statycznymi, gdy:

  • to jest proste, metoda wejścia-wyjścia (wszystkie rodzaje „oblicz tego względu, że”)
  • jest niezawodny, przez co mamy na myśli to albo przetestowany przez Ciebie jednostka lub pochodzi z 3rd źródła partii rozważyć niezawodny (na przykład. Math.Floor można uznać za niezawodny - używanie go nie powinno podnosić "Uważaj, jest statyczne!" ostrzeżenie; można założyć, że Microsoft wykonuje swoją pracę)

Kiedy metody statyczne spowodują problemy i należy ich unikać?W zasadzie tylko wtedy, gdy ich interakcji z/zrobić coś, czego nie może kontrolować (lub makiety):

  • wszelkiego rodzaju systemu plików, bazy danych zależnościami sieciowymi
  • innych (prawdopodobnie bardziej skomplikowanych) metod statycznych wywoływane z wewnątrz
  • prawie wszystko twój szyderczy ramy nie może zajmować się na zwykłych warunkach

Edit:dwa przykłady, gdy metoda statyczna będzie make testowanie jednostkowe ciężko

public int ExtractSumFromReport(string reportPath) 
{ 
    var reportFile = File.ReadAllText(reportPath); 
    // ... 
} 

Jak radzić sobie z File.ReadAllText? To oczywiście przejdzie do systemu plików, aby pobrać zawartość pliku, co nie jest ważne podczas testów jednostkowych. Jest to przykład metody statycznej z zewnętrzną zależnością. Aby tego uniknąć, zwykle tworzysz wrapper wokół api systemu plików lub po prostu wstrzykujesz go jako zależność/delegata.

public void SaveUser(User user) 
{ 
    var session = SessionFactory.CreateSession(); 
    // ... 
} 

Co na ten temat? Sesja to nietrywialna zależność. Pewnie, może przyjść jako ISession, ale jak wymusić SessionFactory, aby powrócić z fałszywą próbą? Nie możemy. I nie możemy stworzyć obiektu łatwego do detekcji .

W takich przypadkach najlepiej unikać stosowania metod statycznych.

+1

, co się dzieje, gdy metoda statyczna wykonuje obliczenia i nie można z nich kpić? Czy wymaga to metody instancji? – Pingpong

+2

@Pingpong: Czy mógłbyś nieco rozwinąć? 'Math.Floor' wykonuje obliczenia - czy szydzimy z nich? Nie, ponieważ wiemy, że 'Math.Floor (2.5)' zwróci 2. Kiedy dane wejściowe są ** łatwe do ustalenia ** nie musisz niczego drwić (lub używać instancji). Cała * statyczna metoda sprawia, że ​​testowanie jest trudne * wynika z sytuacji, w których dostarczają one nietrywialnych zależności lub mają efekty uboczne. Zobacz moją edycję. –

+0

Co ze statyczną metodą to niestandardowa metoda, która wykonuje długie obliczenia procesu? – Pingpong

2

Nie można wyśmiać statycznych metod/właściwości. Tak więc, gdy twój classA używa jakiegoś statycznego elementu z classB, nie możesz przetestować pojedynczo osobnika classA.

AKTUALIZACJA: Nie widzę problemu z zawijaniem niektórych klas statycznych do obiektu. Nie zajmuje dużo czasu, ale pozwala zmniejszyć sprzężenie w systemie.

4

Metody statyczne CAN mogą być testowane w jednostce. Nie mogą one być wyśmiewany (ogólnie, istnieją pewne ramy, aby to zrobić jak Moles

+0

Jest to jednak przesada w prostych przypadkach. Mole integrują się w procesie kompilacji i są dostępne tylko dla .net – undefined

0

Technicznie ty może mock statycznej metody w Javie z PowerMock, ale jeśli trzeba to zrobić bym poważnie polecić byłaby kodu. Myślę, że statyczne metody powinny zawsze być private i używane tylko wewnątrz klas, w których są zdefiniowane, do wewnętrznych celów. Uważam publicznie wyeksponowaną metodę statyczną za a code smell.

Powiązane problemy