Domanda

Qual è il miglior framework per la creazione di mock oggetti in Java?Perché?Quali sono i pro e i contro di ogni quadro?

È stato utile?

Soluzione

Ho avuto un buon successo utilizzando Mockito.

Quando ho cercato di apprendimento su JMock e EasyMock, ho trovato la curva di apprendimento un po ' ripida (anche se forse solo a me).

Mi piace Mockito a causa della sua semplice e sintassi pulita che ero in grado di afferrare abbastanza rapidamente.Il minimo sintassi è progettato per supportare i comuni casi molto bene, anche se le poche volte che ho bisogno di fare qualcosa di più complicato, ho trovato quello che volevo era supportato e facile da afferrare.

Ecco un (in forma abbreviata) esempio dal Mockito homepage:

import static org.mockito.Mockito.*;

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

Non ottiene molto più semplice.

L'unico grave inconveniente che posso pensare è che non mock metodi statici.

Altri suggerimenti

Io sono il creatore di PowerMock così, ovviamente, devo consiglia!:-)

PowerMock si estende sia EasyMock e Mockito con la possibilità di mock metodi statici, finale e anche i metodi privati.Il EasyMock il supporto è completo, ma il Mockito plugin ha bisogno di qualche lavoro in più.Stiamo progettando di aggiungere JMock supporto.

PowerMock non è destinato a sostituire altri quadri, ma può essere utilizzato in situazioni difficili, quando altri quadri non consente beffardo.PowerMock contiene anche altre utili funzioni come l' soppressione di inizializzatori statici e i costruttori.

Il JMockit sito di progetto contiene un sacco di informazioni comparative per il corrente beffardo toolkit.

In particolare, controllare il caratteristica matrice di confronto, che copre EasyMock, jMock, Mockito, Unitils Finto, PowerMock, e, naturalmente, JMockit.Io cerco di mantenere accurate e up-to-date, per quanto possibile.

Ho avuto successo con JMockit.

È abbastanza nuovo, e quindi è un po ' crudo e scarsamente documentate.Utilizza ASM dinamicamente ridefinire la classe bytecode, quindi è possibile creare un mock tutti i metodi 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'Aspettative interfaccia che consente la registrazione/riproduzione di scenari così:

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

Lo svantaggio è che richiede Java 5/6.

Si potrebbe avere anche un'occhiata al test di Groovy.In Groovy si può facilmente mock interfacce Java utilizzando il 'come' operatore:

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

Oltre a questa funzionalità di base Groovy offre molto di più su beffardo di fronte, tra cui la potente MockFor e StubFor classi.

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

Ho iniziato a usare le simulazioni con EasyMock.Abbastanza facile da capire, ma il replay passo è stato un pò fastidioso. Mockito rimuove questo, ha anche un pulitore di sintassi, come sembra leggibilità era uno dei suoi obiettivi primari.Non posso sottolineare abbastanza quanto questo sia importante, dato che la maggior parte degli sviluppatori si passano il loro tempo a leggere e manutenzione di codice esistente, non la creazione di esso.

Un'altra cosa bella è che le interfacce e le classi di implementazione sono trattati allo stesso modo, a differenza EasyMock dove ancora è necessario ricordare (e di controllo) per l'utilizzo di un EasyMock Estensione della Classe.

Ho preso una rapida occhiata al JMockit di recente, e mentre la lista delle caratteristiche è piuttosto completo, penso che il prezzo di questo è la leggibilità del codice risultante, e di dover scrivere di più.

Per me, Mockito colpisce il sweet spot, essere facile da scrivere e da leggere, e trattare con la maggior parte delle situazioni la maggior parte del codice sarà necessario.Utilizzando Mockito con PowerMock sarebbe la mia scelta.

Una cosa da considerare è che lo strumento si potrebbe scegliere se erano in grado di sviluppare da soli, o in un piccolo gruppo di lavoro affiatato, potrebbe non essere la migliore per entrare in una grande azienda con un team di sviluppatori di diversi livelli di abilità.Leggibilità, facilità di utilizzo e semplicità avrebbe bisogno di più considerazione in quest'ultimo caso.Non ha senso farsi il finale beffardo quadro se un sacco di persone finiscono per non utilizza o non mantenendo le prove.

Siamo pesantemente utilizzando EasyMock e EasyMock Estensione della Classe al lavoro e sono abbastanza soddisfatto.Fondamentalmente, ti offre tutto ciò di cui hai bisogno.Date un'occhiata alla documentazione, c'è un bell'esempio che mostra tutte le caratteristiche di EasyMock.

Ho usato JMock presto.Ho provato Mockito al mio ultimo progetto, e mi è piaciuto.Più conciso, più pulito.PowerMock copre tutti i bisogni che sono assenti in Mockito, come beffardo statica del codice, la derisione di un'istanza di creazione, beffardo finale classi e metodi.Così ho tutto quello che ho bisogno per svolgere il mio lavoro.

Mi piace JMock perché siete in grado di impostare le aspettative.Questo è totalmente diverso da verificare se un metodo è stato chiamato trovati in alcuni mock librerie.Utilizzando JMock si può scrivere molto sofisticati aspettative.Vedere la jmock cheat-guaina.

Sì, Mockito è un grande quadro.Io lo uso insieme con hamcrest e Google guice per impostare il mio test.

La soluzione migliore per un beffardo è quello di avere la macchina a fare tutto il lavoro con automatici specifica-based testing.Per Java, vedere ScalaCheck e il Detrazione quadro inclusi nel Funzionale Java biblioteca.Con automatici specifica a base di framework di test, è necessario fornire una specificazione del metodo in esame (una proprietà che deve essere vero) e il framework genera test di oggetti fittizi, automaticamente.

Per esempio, la proprietà seguente test di Matematica.sqrt metodo per vedere se la radice quadrata di un numero intero positivo n al quadrato è uguale a n.

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

Quando si chiama propSqrt.check(), ScalaCheck genera centinaia di numeri interi e controlla le proprietà per ogni, anche automaticamente, assicurandosi che i casi limite sono coperti bene.

Anche se ScalaCheck è scritto in Scala, e richiede il Compilatore Scala, è facile di testare il codice Java con esso.La Detrazione quadro Funzionale Java è un puro Java attuazione degli stessi concetti.

Mockito offre anche la possibilità di stubbing metodi, corrispondenti argomenti (come anyInt() e anyString()), verificando il numero di invocazioni (volte(3), atLeastOnce(), mai()), e più.

Ho anche scoperto che è Mockito semplice e pulito.

Una cosa che non mi piace Mockito è che si non può stub metodi statici.

Per qualcosa di un po ' diverso, si potrebbe utilizzare JRuby e Moka che sono combinate a JtestR scrivere test per il codice Java in espressive e sintetica Rubino.Ci sono alcuni utili beffardo esempi con JtestR qui.Un vantaggio di questo approccio è che beffarda classi concrete è molto semplice.

Ho iniziato a usare le simulazioni attraverso JMock, ma alla fine passa a utilizzare EasyMock.EasyMock era proprio questo, facile ---- e ha fornito una sintassi che si sentiva più naturale.Non ho acceso dal.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top