Jaka jest najlepsza fałszywa platforma dla Java? [Zamknięte]

347

Jakie są najlepsze ramy do tworzenia fałszywych obiektów w Javie? Dlaczego? Jakie są zalety i wady poszczególnych ram?

Josh Brown
źródło

Odpowiedzi:

315

Korzystam z Mockito .

Kiedy próbowałem dowiedzieć się o JMock i EasyMock, zauważyłem, że krzywa uczenia się jest nieco stroma (choć może to tylko ja).

Lubię Mockito ze względu na jego prostą i czystą składnię, którą byłem w stanie dość szybko zrozumieć. Minimalna składnia została zaprojektowana tak, aby bardzo dobrze obsługiwać typowe przypadki, chociaż kilka razy, gdy musiałem zrobić coś bardziej skomplikowanego, znalazłem to, co chciałem, było obsługiwane i łatwe do zrozumienia.

Oto (skrócony) przykład ze strony głównej Mockito:

import static org.mockito.Mockito.*;

List mockedList = mock(List.class);
mockedList.clear();
verify(mockedList).clear();

Nie ma nic prostszego.

Jedynym poważnym minusem, jaki mogę wymyślić, jest to, że nie będzie on kpił z metod statycznych.

Brian Laframboise
źródło
15
Piękny. W przypadku metod statycznych wystarczy połączyć Mockito z JMockit i praktycznie nie ma zbyt „klasycznej” klasy, aby można było przetestować.
Epaga
6
Uwielbiam, kiedy próbując zrobić coś, czego nie powinieneś (np. Tworzyć makiety w linii), otrzymujesz bardzo jasne wyjaśnienie tego, co zrobiłeś źle w komunikacie o wyjątku.
ripper234
3
Dla mnie absolutnie. Nadal poleciłbym to bezwarunkowo. Oczywiście, jeśli znajdziesz inny system, który lepiej spełnia twoje potrzeby, wspomnij o nim w innej odpowiedzi i zobacz, jakie głosy otrzyma i jakie komentarze.
Brian Laframboise
2
@MexicanHacker dlaczego nie możesz użyć go na Androidzie? Używam go teraz z Robolectric.
Ilkka
2
Używam Mockito i uwielbiam to !! Również świetna dokumentacja (tak rzadko znajduję dokumentację tej jakości, dobra robota od autorów), co jest dla nas bardzo ważne, aby używać rzeczy bez konieczności zagłębiania się w kod frameworka !!!
Renato,
84

Jestem twórcą PowerMock, więc oczywiście muszę to polecić! :-)

PowerMock rozszerza zarówno EasyMock, jak i Mockito o możliwość kpienia z metod statycznych , ostatecznych, a nawet prywatnych. Obsługa EasyMock jest kompletna, ale wtyczka Mockito wymaga nieco więcej pracy. Planujemy również dodać obsługę JMock.

PowerMock nie jest przeznaczony do zastępowania innych frameworków, raczej może być użyty w trudnych sytuacjach, gdy inne framework'y nie pozwalają na kpiny. PowerMock zawiera również inne przydatne funkcje, takie jak tłumienie statycznych inicjatorów i konstruktorów.

Jan Kronquist
źródło
Powermock jest niezbędny do testowania jednostkowego aplikacji na Androida przy użyciu natywnej Javy na komputerze-hoście (unikając używania powolnego emulatora)
Jeff Axelrod
@Jan jedynym problemem jest to, że PowerMock jest niekompatybilny podczas korzystania z Robolectric :-( Chcę zrobić @RunWith (PowerMockRunner.class) ORAZ @RunWith (RobolectricTestRunner.class)
Blundell
Po korzystaniu z PowerMock przez ostatnie kilka miesięcy serdecznie polecam!
cwash
PowerMock jest naprawdę niesamowity. Naprawdę uwielbiam statyczne singletony, aby mieć dostęp do wszystkiego, a to umożliwia testowanie.
Ian Macalinao,
Zastrzeżenie: niektóre rzeczy, takie jak wyśmiewanie ostatecznych metod, są możliwe tylko w Powermock dla EasyMock, a nie dla Mockito. To trochę kłopotliwe, kiedy nie używasz go tak często. Zastanawiałem się, dlaczego coś nie działa, a potem zdałem sobie sprawę, że jest to wymienione tylko w sekcji Easymock doco.
trafalmadorian
46

Witryna projektu JMockit zawiera wiele informacji porównawczych dla aktualnych zestawów narzędzi do kpin.

W szczególności sprawdź macierz porównania funkcji , która obejmuje EasyMock, jMock, Mockito, Unitils Mock, PowerMock i oczywiście JMockit. Staram się, aby był on dokładny i aktualny, o ile to możliwe.

Rogério
źródło
1
Jestem pod wrażeniem JMockit, ma bardziej stromą krzywą uczenia się, ale ma bardzo dobrą dokumentację przez lata i może kpić z wszystkiego. Zacząłem od Mockito, którego łatwo było się nauczyć, ale regularnie napotykałem problemy, których nie mogłem rozwiązać. Z drugiej strony nie mogę sobie nawet wyobrazić, co jest niemożliwe w JMockit.
Hontvári Levente
21

Odniosłem sukces z JMockit .

Jest całkiem nowy, więc jest trochę surowy i niedokumentowany. Używa ASM, aby dynamicznie przedefiniować kod bajtowy klasy, dzięki czemu może wyśmiewać wszystkie metody, w tym statyczne, prywatne, konstruktory i statyczne inicjalizatory. Na przykład:

import mockit.Mockit;

...
Mockit.redefineMethods(MyClassWithStaticInit.class,
                       MyReplacementClass.class);
...
class MyReplacementClass {
  public void $init() {...} // replace default constructor
  public static void $clinit{...} // replace static initializer
  public static void myStatic{...} // replace static method
  // etc...
}

Posiada interfejs Oczekiwania, który umożliwia także scenariusze nagrywania / odtwarzania:

import mockit.Expectations;
import org.testng.annotations.Test;

public class ExpecationsTest {
  private MyClass obj;

  @Test
  public void testFoo() {
    new Expectations(true) {
      MyClass c;
      {
        obj = c;
        invokeReturning(c.getFoo("foo", false), "bas");
      }
    };

    assert "bas".equals(obj.getFoo("foo", false));

    Expectations.assertSatisfied();
  }

  public static class MyClass {
    public String getFoo(String str, boolean bool) {
      if (bool) {
        return "foo";
      } else {
        return "bar";
      }
    }
  }
}

Minusem jest to, że wymaga Java 5/6.

Kris Pruden
źródło
tak, naprawdę mogę to polecić
Epaga
7
Tylko aktualizacja: projekt JMockit został przeniesiony na code.google.com/p/jmockit . Od tego postu (i wciąż się rozwija) DUŻO ewoluowało, a teraz ma obszerną dokumentację.
Rogério,
JMockit przeprowadził się ponownie. Jest teraz dostępny w Github. jmockit.github.io
Ravi Thapliyal
15

Możesz także rzucić okiem na testowanie przy użyciu Groovy. W Groovy możesz łatwo wyśmiewać interfejsy Java za pomocą operatora „as”:

def request = [isUserInRole: { roleName -> roleName == "testRole"}] as HttpServletRequest 

Oprócz tej podstawowej funkcjonalności Groovy oferuje o wiele więcej na szyderczym froncie, w tym potężne MockFori StubForklasy.

http://docs.codehaus.org/display/GROOVY/Groovy+Mocks

p3t0r
źródło
13

Zacząłem używać mocków w EasyMock . Łatwo to zrozumieć, ale powtórka była dość irytująca. Mockito usuwa to, ma również czystszą składnię, ponieważ wygląda na to, że czytelność była jednym z jej głównych celów. Nie mogę wystarczająco podkreślić, jak ważne jest to, ponieważ większość programistów poświęci swój czas na czytanie i utrzymanie istniejącego kodu, a nie jego tworzenie.

Kolejną miłą rzeczą jest to, że interfejsy i klasy implementacyjne są obsługiwane w ten sam sposób, w przeciwieństwie do EasyMock, w którym nadal trzeba pamiętać (i sprawdzać), aby użyć rozszerzenia klasy EasyMock.

Niedawno rzuciłem okiem na JMockit i chociaż lista funkcji prania jest dość wyczerpująca, myślę, że ceną tego jest czytelność wynikowego kodu i konieczność pisania więcej.

Dla mnie Mockito trafia w dobry punkt, jest łatwy do pisania i czytania oraz radzenia sobie z większością sytuacji, w których wymagany będzie większość kodu. Używanie Mockito z PowerMock byłoby moim wyborem.

Jedną rzeczą do rozważenia jest to, że narzędzie, które wybierzesz, jeśli tworzysz sam lub w małym zgranym zespole, może nie być najlepszym rozwiązaniem dla dużej firmy z programistami o różnych poziomach umiejętności. Czytelność, łatwość użycia i prostota wymagałyby więcej uwagi w tym drugim przypadku. Nie ma sensu uzyskiwać ostatecznego frameworka, jeśli wiele osób ostatecznie go nie używa lub nie utrzymuje testów.

trafalmadorian
źródło
1
+1 Ta odpowiedź wymaga więcej głosów pozytywnych. Należy podzielić się tym, co tak naprawdę lubią, a co nie na temat frameworka. Po prostu „użyłem tego ... i podobało mi się!” jest jednym z powodów, dla których tak dobre pytania są zamykane na SO.
Ravi Thapliyal
11

W pracy intensywnie korzystamy z EasyMock i EasyMock Class Extension i jesteśmy z tego bardzo zadowoleni. Zasadniczo daje wszystko, czego potrzebujesz. Spójrz na dokumentację, jest bardzo ładny przykład, który pokazuje wszystkie funkcje EasyMock.

dlinsin
źródło
1
W moim pytaniu bardziej szukałem tego, co lubisz, a czego nie lubisz w fałszywym frameworku. Mogę znaleźć dokumentację i przeczytać o niej wszystko - chcę wiedzieć, co myślą o tym ludzie, którzy ją wykorzystali.
Josh Brown
EasyMock działa tylko na Javie 5 i nowszych, argh!
matt b
8

Użyłem JMock wcześnie. Próbowałem Mockito przy moim ostatnim projekcie i podobało mi się. Bardziej zwięzłe, bardziej czyste. PowerMock obejmuje wszystkie potrzeby, których nie ma w Mockito, takie jak wyśmiewanie kodu statycznego, wyśmiewanie tworzenia instancji, wyśmiewanie końcowych klas i metod. Mam więc wszystko, czego potrzebuję do wykonania mojej pracy.

Dmitry
źródło
6

Lubię JMock, ponieważ jesteś w stanie ustawić oczekiwania. Jest to całkowicie odmienne od sprawdzania, czy w niektórych fałszywych bibliotekach została wywołana metoda. Za pomocą JMock możesz pisać bardzo wyszukane oczekiwania. Zobacz jmock cheat-sheat .

Andrea Francia
źródło
5

Tak, Mockito to świetny framework. Używam go razem z hamcrestem i guice Google do konfiguracji moich testów.

Bartosz Bierkowski
źródło
4

Najlepszym rozwiązaniem drwiny jest zlecenie, aby maszyna wykonała całą pracę dzięki zautomatyzowanym testom opartym na specyfikacji. Jeśli chodzi o Javę, zobacz ScalaCheck i środowisko Reductio zawarte w bibliotece Functional Java . Dzięki zautomatyzowanym ramom testowym opartym na specyfikacji dostarczasz specyfikację testowanej metody (właściwość, która powinna być prawdziwa), a struktura automatycznie generuje testy, a także próbne obiekty.

Na przykład następująca właściwość testuje metodę Math.sqrt, aby sprawdzić, czy pierwiastek kwadratowy z dowolnej liczby dodatniej n kwadrat jest równy n.

val propSqrt = forAll { (n: Int) => (n >= 0) ==> scala.Math.sqrt(n*n) == n }

Kiedy dzwonisz propSqrt.check(), ScalaCheck generuje setki liczb całkowitych i sprawdza twoją własność dla każdej z nich, automatycznie również upewniając się, że skrzynki brzegowe są dobrze pokryte.

Mimo że ScalaCheck jest napisany w języku Scala i wymaga kompilatora Scala, łatwo jest z nim przetestować kod Java. Struktura Reductio w Functional Java to czysta implementacja Java tych samych pojęć.

Apokalipsa
źródło
3

Mockito zapewnia również opcję stubowania, dopasowywania argumentów (jak anyInt () i anyString ()), sprawdzania liczby wywołań (times (3), atLeastOnce (), never ()) i innych .

Przekonałem się również, że Mockito jest prosty i czysty .

Jedną rzeczą, która mi się nie podoba w Mockito, jest to, że nie można upuścić metod statycznych .

Josh Brown
źródło
Ta odpowiedź jest niedokładna. Nie jesteś ograniczony do interfejsów z jMock. Możesz wyśmiewać konkretne klasy za pomocą ClassImposteriser.
Teflon Ted
Z EasyMock możesz robić dokładnie to samo.
Cem Catikkas,
Usunąłem niedokładności z mojej odpowiedzi.
Josh Brown
2

Dla czegoś nieco innego, możesz użyć JRuby i Mocha, które są połączone w JtestR, aby napisać testy kodu Java w ekspresyjnym i zwięzłym Ruby. Istnieje kilka przydatnych przykładów kpienia z JtestR tutaj . Zaletą tego podejścia jest to, że drwiny z konkretnych klas są bardzo proste.

James Mead
źródło
1

Zacząłem używać mocków za pomocą JMocka, ale ostatecznie przeszedłem na EasyMock. EasyMock był po prostu tym - łatwiejszy - i zapewniał bardziej naturalną składnię. Od tamtej pory nie zmieniłem się.

Mike Furtak
źródło