Ce's cel mai bun cadru pentru crearea de machete de obiecte în Java? De ce? Care sunt argumentele pro și contra de fiecare cadru?
Am'am avut succes folosind Mockito.
Când am încercat să aflu JMock și EasyMock, am găsit o curbă de învățare pentru a fi un pic abrupt (deși poate că's doar eu).
Îmi place Mockito din cauza naturii sale simple si curate, sintaxa că am fost capabil să înțeleagă destul de repede. Minim sintaxa este conceput pentru a sprijini frecvente cazuri foarte bine, deși de câteva ori am nevoie să fac ceva mai complicat, am găsit ceea ce am vrut a fost susținută și ușor de înțeles.
Aici's o (prescurtată) exemplu de Mockito pagina de start:
import static org.mockito.Mockito.*;
List mockedList = mock(List.class);
mockedList.clear();
verify(mockedList).clear();
Nu't obține mult mai simplu decât asta.
Singurul dezavantaj major, care mă pot gândi este că nu o't bate joc de metode statice.
Eu sunt creatorul de PowerMock atât de evident că trebuie să recomandăm! :-)
PowerMock se extinde atât EasyMock și Mockito cu capacitatea de a bate joc de metode statice, finală și chiar metode private. La EasyMock sprijin este completă, dar Mockito plugin-ul are nevoie de ceva mai mult de lucru. Suntem de planificare pentru a adăuga JMock suport la fel de bine.
PowerMock nu este destinat să înlocuiască alte cadre, mai degrabă, acesta poate fi utilizat în situații dificile, atunci când alte cadre nu't permite batjocoritor. PowerMock conține, de asemenea, alte caracteristici utile, cum ar fi suprimarea static de initializare și constructori.
≪a href="http://jmockit.org">JMockit site-ul proiectului conține o mulțime de informații comparative pentru curent batjocoritor seturi de instrumente.
În special, a verifica afară de caracteristică comparație matrix, care acoperă EasyMock, jMock, Mockito, Unitils Machete, PowerMock, și, desigur, JMockit. Am să încercați să păstrați-l exacte și up-to-data, cât mai mult posibil.
Am'am avut succes cu JMockit.
L's destul de nou, și așa l's un pic prime și sub-documentate. Se folosește AȘM pentru dinamic redefini clasa bytecode, astfel încât acesta poate bate joc de toate metodele, inclusiv static, private, constructori, și statice de initializare. De exemplu:
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...
}
Acesta are o Așteptările interfață, permițându-înregistrare/redare scenarii precum:
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";
}
}
}
}
Dezavantajul este că necesită Java 5/6.
Ai putea, de asemenea, au o privire la testarea folosind Groovy. În Groovy puteți cu ușurință machete interfețe Java folosind 'ca' operator:
def request = [isUserInRole: { roleName -> roleName == "testRole"}] as HttpServletRequest
În afară de această funcționalitate de bază Groovy oferă o mulțime mai mult pe batjocoritor față, inclusiv puternic MockFor " și " StubFor
clase.
Am început să folosesc și bate joc cu EasyMock. Destul de ușor de înțeles, dar reluarea pas a fost cam enervant. Mockito elimină acest, are, de asemenea, un aspirator de sintaxă ca se pare ca lizibilitate a fost unul dintre scopurile principale. Nu pot sublinia îndeajuns cât de important este acest lucru, deoarece cele mai multe dintre dezvoltatorii își vor petrece timpul citind și menținerea cod existent, nu crearea de ea.
Un alt lucru frumos este că interfețe și punerea în aplicare clase sunt tratate în același mod, spre deosebire de EasyMock în cazul în care încă aveți nevoie să vă amintiți (și verificare) pentru a utiliza un EasyMock Clasa Extensie.
Am'am luat o privire rapidă la JMockit recent, și în timp ce listă lungă de caracteristici este destul de cuprinzătoare, cred că prețul este lizibilitatea codul rezultat, și avea să scrie mai mult.
Pentru mine, Mockito hit-uri la fața locului dulce, fiind ușor să scrie și să citească, și care se ocupă cu majoritatea dintre situațiile cele mai multe codului va necesita. Folosind Mockito cu PowerMock ar fi alegerea mea.
Un lucru să ia în considerare este că instrumentul-ai alege dacă ai fi fost în curs de dezvoltare de unul singur, sau într-o mică echipă de nedespărțit, s-ar putea să nu fie cele mai bune pentru a obține pentru o companie mare, cu dezvoltatorii de diferite niveluri de calificare. Lizibilitate, ușurința de utilizare și simplitate ar avea nevoie de mai multă atenție în acest din urmă caz. Nu are rost să mă final batjocoritor cadru cazul în care o mulțime de oameni ajung să nu-l folosești sau nu menținerea teste.
Suntem puternic folosind EasyMock și EasyMock Clasa de Prelungire la locul de muncă și sunt destul de fericit cu ea. Este practic vă oferă tot ce ai nevoie. Aruncati o privire la documentația, acolo's un foarte frumos exemplu care arată toate caracteristicile de EasyMock.
Am folosit JMock devreme. Am'am incercat Mockito la ultimul meu proiect și plăcut. Mai concis, mai curat. PowerMock acoperă toate nevoile, care sunt absente în Mockito, cum ar fi mișto un cod static, batjocoritor un exemplu de creare, batjocoritor final clase și metode. Așa că am tot ce am nevoie pentru a efectua munca mea.
Îmi place JMock pentru că sunteți în stare să creeze așteptări. Acest lucru este total diferit de a verifica dacă o metodă fost numit găsit în unele machete biblioteci. Folosind JMock puteți scrie foarte sofisticate așteptările. Vezi jmock cheat-sheat.
Da, Mockito este un cadru de mare. Îl folosesc împreună cu hamcrest și Google guice pentru a seta testele mele.
Cea mai bună soluție pentru a bate joc este de a avea aparatul face toate lucrările cu automate specification-based testing. Pentru Java, a se vedea ScalaCheck și Reducere cadru inclus în Funcționale Java biblioteca. Cu caietul de sarcini automatizate bazate pe framework-uri de testare, vă furnizeze o descriere a metodei de sub test (o proprietate despre el că ar trebui să fie adevărat) și cadrul generează teste precum și obiecte machete, în mod automat.
De exemplu, următoarea proprietate teste de Matematica.sqrt metoda pentru a vedea dacă rădăcina pătrată a oricărui număr pozitiv n la patrat este egal cu n.
val propSqrt = forAll { (n: Int) => (n >= 0) ==> scala.Math.sqrt(n*n) == n }
Atunci când te sun propSqrt.verifica()
, ScalaCheck generează sute de numere întregi și verifică proprietate pentru fiecare, de asemenea, automat, asigurându-vă că marginea de cazuri sunt acoperite bine.
Chiar dacă ScalaCheck este scris în Scala, și necesită Scala Compiler, l's ușor pentru a testa codul Java cu ea. Reducerea la absurd cadru Funcțional Java este o pură Java aplicare a acelorași concepte.
Mockito oferă, de asemenea, opțiunea de a miscand metode, de potrivire argumente (ca anyInt() și anyString()), verificarea serie de invocații (ori(3), atLeastOnce(), nu()), și altele.
Am'am găsit, de asemenea, că Mockito este simplu și curat.
Un singur lucru nu't ca despre Mockito este că poate't stub metode statice.
Pentru ceva un pic diferit, ai putea folosi JRuby și Moca, care sunt combinate în JtestR pentru a scrie teste pentru cod Java în expresive și succint Ruby. Există unele utile batjocoritor exemple cu JtestR aici. Un avantaj al acestei abordări este că batjocoritor clasele de beton este foarte simplu.