Qual è il miglior framework simulato per Java? [chiuso]


347

Qual è il miglior framework per creare oggetti finti in Java? Perché? Quali sono i pro e i contro di ciascun framework?

Risposte:


315

Ho avuto un buon successo usando Mockito .

Quando ho provato a conoscere JMock ed EasyMock, ho scoperto che la curva di apprendimento era un po 'ripida (anche se forse sono solo io).

Mi piace Mockito per la sua sintassi semplice e pulita che sono stato in grado di cogliere abbastanza rapidamente. La sintassi minima è progettata per supportare molto bene i casi comuni, anche se le poche volte in cui ho dovuto fare qualcosa di più complicato ho scoperto che ciò che volevo era supportato e facile da comprendere.

Ecco un esempio (abbreviato) dalla homepage di Mockito:

import static org.mockito.Mockito.*;

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

Non è molto più semplice di così.

L'unico aspetto negativo principale che mi viene in mente è che non deriderà i metodi statici.


15
Bellissimo. Per i metodi statici, è sufficiente combinare Mockito con JMockit e non esiste praticamente alcuna classe troppo "legacy" per essere in grado di testare.
Epaga,

6
Adoro come quando provi a fare qualcosa che non dovresti (ad esempio creare simulazioni in linea), ottieni una spiegazione molto chiara di ciò che hai fatto di sbagliato nel messaggio di eccezione.
ripper234,

3
Per me assolutamente. Lo consiglierei ancora incondizionatamente. Naturalmente, se trovi un altro framework che soddisfa meglio le tue esigenze, menzionalo in un'altra risposta e vedi quali voti ottiene e che tipo di commenti riceve.
Brian Laframboise,

2
@MexicanHacker perché non hai potuto usarlo per Android? Lo sto usando proprio ora, con Robolectric.
Ilkka,

2
Sto usando Mockito e lo adoro !! Ottima documentazione anche (così rara da trovare documentazione di questa qualità, buon lavoro dagli autori), che è così importante per noi usare le cose senza dover scavare nel codice del framework !!!
Renato

84

Sono il creatore di PowerMock, quindi ovviamente devo raccomandarlo! :-)

PowerMock estende sia EasyMock che Mockito con la possibilità di deridere metodi statici , finali e persino privati. Il supporto EasyMock è completo, ma il plug-in Mockito richiede un po 'più di lavoro. Stiamo programmando di aggiungere anche il supporto JMock.

PowerMock non è destinato a sostituire altri framework, ma può essere utilizzato nelle situazioni difficili in cui altri framework non consentono il derisione. PowerMock contiene anche altre utili funzionalità come la soppressione di inizializzatori e costruttori statici .


Powermock è essenziale per testare le applicazioni Android utilizzando Java nativo sul PC host (evitando di utilizzare l'emulatore lento)
Jeff Axelrod

L'unico problema di @Jan è che PowerMock non è compatibile quando si utilizza Robolectric :-( Voglio fare @RunWith (PowerMockRunner.class) E @RunWith (RobolectricTestRunner.class)
Blundell,

Dopo aver usato PowerMock negli ultimi mesi, lo consiglio vivamente!
Cwash

PowerMock è davvero fantastico. Adoro i singoli statici per accedere a tutto, e questo rende possibile il test.
Ian Macalinao,

Avvertenza: alcune cose come deridere i metodi finali sono possibili solo in Powermock per EasyMock e non per Mockito. È un po 'un gotcha quando non lo usi così spesso. Mi chiedevo perché qualcosa non funzionasse, poi mi sono reso conto che è elencato solo nella sezione Easymock del doco.
Trafalmadorian,

46

Il sito del progetto JMockit contiene molte informazioni comparative per gli attuali kit di strumenti di simulazione.

In particolare, controlla la matrice di confronto delle funzionalità , che copre EasyMock, jMock, Mockito, Unitils Mock, PowerMock e ovviamente JMockit. Cerco di mantenerlo il più possibile accurato e aggiornato.


1
Sono impressionato da JMockit, ha una curva di apprendimento più ripida, ma ha un'ottima documentazione per anni e può deridere qualsiasi cosa. Ho iniziato con Mockito, che era facile da imparare, ma ho incontrato regolarmente problemi che non riuscivo a risolvere con esso. D'altra parte non riesco nemmeno a immaginare cosa sia impossibile con JMockit.
Hontvári Levente,

21

Ho avuto successo con JMockit .

È piuttosto nuovo, quindi è un po 'grezzo e poco documentato. Utilizza ASM per ridefinire dinamicamente il bytecode della classe, in modo da poter deridere tutti i metodi inclusi statici, privati, costruttori e inizializzatori statici. Per esempio:

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...
}

Ha un'interfaccia Expectations che consente anche scenari di registrazione / riproduzione:

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";
      }
    }
  }
}

Il rovescio della medaglia è che richiede Java 5/6.


sì, posso davvero consigliare questo
Epaga il

7
Solo un aggiornamento: il progetto JMockit è passato a code.google.com/p/jmockit . Si è evoluto MOLTO da questo post (e si sta ancora evolvendo), e ora ha una vasta documentazione.
Rogério,

JMockit si è spostato di nuovo. Ora è disponibile su Github. jmockit.github.io
Ravi Thapliyal,

15

Puoi anche dare un'occhiata ai test usando Groovy. In Groovy puoi facilmente deridere le interfacce Java usando l'operatore 'as':

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

Oltre a questa funzionalità di base, Groovy offre molto di più sul fronte beffardo, compresi i potenti MockFore le StubForclassi.

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


13

Ho iniziato a usare i mock con EasyMock . Abbastanza facile da capire, ma il passaggio di replay è stato piuttosto fastidioso. Mockito lo rimuove, ha anche una sintassi più pulita in quanto sembra che la leggibilità fosse uno dei suoi obiettivi principali. Non posso sottolineare abbastanza quanto sia importante, dal momento che la maggior parte degli sviluppatori passerà il loro tempo a leggere e mantenere il codice esistente, non a crearlo.

Un'altra cosa interessante è che le interfacce e le classi di implementazione sono gestite allo stesso modo, diversamente da EasyMock dove è ancora necessario ricordare (e controllare) di utilizzare un'estensione di classe EasyMock.

Ho dato una rapida occhiata a JMockit recente e, sebbene l'elenco delle funzioni della lavanderia sia piuttosto completo, penso che il prezzo sia leggibilità del codice risultante e che debba scrivere di più.

Per me, Mockito colpisce il punto debole, essendo facile da scrivere e leggere e gestire la maggior parte delle situazioni che la maggior parte del codice richiederà. Usare Mockito con PowerMock sarebbe la mia scelta.

Una cosa da considerare è che lo strumento che sceglieresti se stessi sviluppando da solo, o in un piccolo team affiatato, potrebbe non essere il migliore da ottenere per una grande azienda con sviluppatori di diversi livelli di abilità. La leggibilità, la facilità d'uso e la semplicità richiederebbero maggiore considerazione in quest'ultimo caso. Non ha senso ottenere il quadro beffardo definitivo se molte persone finiscono per non usarlo o non mantenere i test.


1
+1 Questa risposta richiede più voti. Si dovrebbe condividere ciò che in realtà gli è piaciuto o meno del framework. Solo "Ho usato questo .. e mi è piaciuto!" è uno dei motivi per cui domande così buone si chiudono su SO.
Ravi Thapliyal,

11

Stiamo usando pesantemente EasyMock e EasyMock Class Extension al lavoro e ne siamo abbastanza soddisfatti. Fondamentalmente ti dà tutto ciò di cui hai bisogno. Dai un'occhiata alla documentazione, c'è un bell'esempio che mostra tutte le funzionalità di EasyMock.


1
Nella mia domanda, ero più alla ricerca di ciò che ti piace e non ti piace di un quadro finto. Posso trovare la documentazione e leggere tutto al riguardo - Voglio sapere cosa ne pensano le persone che l'hanno usata.
Josh Brown,

EasyMock funziona solo su Java 5 e versioni successive, argh!
matt b

8

Ho usato JMock presto. Ho provato Mockito nel mio ultimo progetto e mi è piaciuto. Più conciso, più pulito. PowerMock copre tutte le esigenze assenti in Mockito, come deridere un codice statico, deridere la creazione di un'istanza, deridere classi e metodi finali. Quindi ho tutto ciò che mi serve per svolgere il mio lavoro.


6

Mi piace JMock perché sei in grado di creare aspettative. Questo è totalmente diverso dal verificare se un metodo è stato chiamato trovato in alcune librerie simulate. Utilizzando JMock puoi scrivere aspettative molto sofisticate. Guarda il trucco cheat jmock .



4

La migliore soluzione per deridere è che la macchina faccia tutto il lavoro con test automatici basati su specifiche. Per Java, vedere ScalaCheck e il framework Reductio inclusi nella libreria Functional Java . Con i framework di test automatizzati basati su specifiche, si fornisce una specifica del metodo sotto test (una proprietà su di esso che dovrebbe essere vera) e il framework genera test e oggetti finti automaticamente.

Ad esempio, la seguente proprietà verifica il metodo Math.sqrt per vedere se la radice quadrata di qualsiasi numero positivo n al quadrato è uguale a n.

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

Quando chiami propSqrt.check(), ScalaCheck genera centinaia di numeri interi e controlla la tua proprietà per ognuno, assicurandosi anche automaticamente che i casi limite siano coperti bene.

Anche se ScalaCheck è scritto in Scala e richiede il compilatore Scala, è facile testare il codice Java con esso. Il framework Reductio in Functional Java è una pura implementazione Java degli stessi concetti.


3

Mockito offre anche la possibilità di metodi di stub, argomenti corrispondenti (come anyInt () e anyString ()), verificando il numero di invocazioni (times (3), atLeastOnce (), never ()) e altro .

Ho anche scoperto che Mockito è semplice e pulito .

Una cosa che non mi piace di Mockito è che non puoi stub dei metodi statici .


Questa risposta è inaccurata Non sei limitato alle interfacce con jMock. Puoi deridere classi concrete con ClassImposteriser.
Teflon Ted,

Puoi fare esattamente le stesse cose anche con EasyMock.
Cem Catikkas,

Ho rimosso le inesattezze dalla mia risposta.
Josh Brown,

2

Per qualcosa di un po 'diverso, potresti usare JRuby e Mocha che sono combinati in JtestR per scrivere test per il tuo codice Java in Ruby espressivo e succinto. Ci sono alcuni esempi beffardi utili con JtestR qui . Un vantaggio di questo approccio è che prendere in giro classi concrete è molto semplice.


1

Ho iniziato a usare i mock tramite JMock, ma alla fine sono passato a usare EasyMock. EasyMock era proprio questo, più semplice, e forniva una sintassi più naturale. Non ho cambiato da allora.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.