Frage

Was ist das beste Framework zum Erstellen von Scheinobjekten in Java?Warum?Was sind die Vor- und Nachteile der einzelnen Frameworks?

War es hilfreich?

Lösung

Ich hatte gute Erfolge damit Mockito.

Als ich versuchte, etwas über JMock und EasyMock zu lernen, stellte ich fest, dass die Lernkurve etwas steil war (obwohl das vielleicht nur bei mir der Fall ist).

Ich mag Mockito wegen seiner einfachen und klaren Syntax, die ich ziemlich schnell verstehen konnte.Die minimale Syntax ist so konzipiert, dass sie die gängigen Fälle sehr gut unterstützt, obwohl ich bei den wenigen Malen, in denen ich etwas Komplizierteres tun musste, feststellte, dass das, was ich wollte, unterstützt wurde und leicht zu verstehen war.

Hier ist ein (gekürztes) Beispiel von der Mockito-Homepage:

import static org.mockito.Mockito.*;

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

Viel einfacher geht es nicht.

Der einzige große Nachteil, der mir einfällt, ist, dass statische Methoden nicht simuliert werden.

Andere Tipps

Ich bin der Schöpfer von PowerMock, also muss ich das natürlich empfehlen!:-)

PowerMock erweitert sowohl EasyMock als auch Mockito um die Möglichkeit simulierte statische Methoden, endgültige und sogar private Methoden.Die EasyMock-Unterstützung ist vollständig, aber am Mockito-Plugin muss noch etwas gearbeitet werden.Wir planen, auch JMock-Unterstützung hinzuzufügen.

PowerMock soll andere Frameworks nicht ersetzen, sondern kann in schwierigen Situationen verwendet werden, in denen andere Frameworks kein Mocking zulassen.PowerMock enthält auch andere nützliche Funktionen wie Unterdrückung statischer Initialisierer und Konstrukteure.

Der JMockit-Projektseite enthält zahlreiche Vergleichsinformationen zu aktuellen Mocking-Toolkits.

Schauen Sie sich insbesondere die an Merkmalsvergleichsmatrix, das EasyMock, jMock, Mockito, Unitils Mock, PowerMock und natürlich JMockit umfasst.Ich versuche, es so genau und aktuell wie möglich zu halten.

Ich hatte Erfolg damit JMockit.

Es ist ziemlich neu und daher etwas roh und unzureichend dokumentiert.Es benutzt ASM um den Klassenbytecode dynamisch neu zu definieren, sodass alle Methoden, einschließlich statischer, privater, Konstruktoren und statischer Initialisierer, simuliert werden können.Zum Beispiel:

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

Es verfügt über eine Expectations-Schnittstelle, die auch Aufnahme-/Wiedergabeszenarien ermöglicht:

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

Der Nachteil ist, dass Java 5/6 erforderlich ist.

Sie können sich auch das Testen mit Groovy ansehen.In Groovy können Sie Java-Schnittstellen ganz einfach mit dem Operator „as“ nachahmen:

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

Abgesehen von dieser Grundfunktionalität bietet Groovy noch viel mehr, einschließlich der leistungsstarken MockFor Und StubFor Klassen.

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

Ich habe angefangen, Mocks mit zu verwenden EasyMock.Leicht zu verstehen, aber der Wiederholungsschritt war etwas nervig. Mockito entfernt dies und hat auch eine sauberere Syntax, da es so aussieht, als ob die Lesbarkeit eines seiner Hauptziele war.Ich kann nicht genug betonen, wie wichtig dies ist, da die meisten Entwickler ihre Zeit damit verbringen, vorhandenen Code zu lesen und zu pflegen, anstatt ihn zu erstellen.

Eine weitere schöne Sache ist, dass Schnittstellen und Implementierungsklassen auf die gleiche Weise gehandhabt werden, anders als in EasyMock, wo Sie immer noch daran denken (und überprüfen) müssen, eine EasyMock-Klassenerweiterung zu verwenden.

Ich habe einen kurzen Blick darauf geworfen JMockit Obwohl die Liste der Features ziemlich umfangreich ist, denke ich, dass der Preis dafür die Lesbarkeit des resultierenden Codes und die Notwendigkeit ist, mehr zu schreiben.

Für mich ist Mockito genau das Richtige, da es einfach zu schreiben und zu lesen ist und die meisten Situationen bewältigt, die der meiste Code erfordert.Benutzen Mockito mit PowerMock wäre meine Wahl.

Bedenken Sie, dass das Tool, das Sie wählen würden, wenn Sie alleine oder in einem kleinen, engmaschigen Team entwickeln würden, möglicherweise nicht das beste für ein großes Unternehmen mit Entwicklern unterschiedlicher Qualifikationsniveaus ist.Lesbarkeit, Benutzerfreundlichkeit und Einfachheit müssten im letzteren Fall stärker berücksichtigt werden.Es macht keinen Sinn, das ultimative Mocking-Framework zu bekommen, wenn viele Leute es am Ende nicht verwenden oder die Tests nicht durchführen.

Wir nutzen es stark EasyMock und EasyMock Class Extension im Einsatz und sind ziemlich zufrieden damit.Es gibt Ihnen im Grunde alles, was Sie brauchen.Schauen Sie sich die Dokumentation an, dort gibt es ein sehr schönes Beispiel, das Ihnen alle Funktionen von EasyMock zeigt.

Ich habe JMock schon früh verwendet.Ich habe Mockito bei meinem letzten Projekt ausprobiert und es hat mir gefallen.Prägnanter, klarer.PowerMock deckt alle Anforderungen ab, die in Mockito fehlen, wie z. B. das Verspotten eines statischen Codes, das Verspotten einer Instanzerstellung und das Verspotten endgültiger Klassen und Methoden.Ich habe also alles, was ich brauche, um meine Arbeit zu erledigen.

Ich mag JMock, weil man Erwartungen wecken kann.Dies unterscheidet sich völlig von der Überprüfung, ob in einigen Scheinbibliotheken gefunden wurde, ob eine Methode aufgerufen wurde.Mit JMock können Sie sehr anspruchsvolle Erwartungen formulieren.Siehe den Jmock Betrüger.

Ja, Mockito ist ein großartiges Framework.Ich benutze es zusammen mit Oberschenkelknochen Und Google-Guide um meine Tests einzurichten.

Die beste Lösung gegen Spott besteht darin, die Maschine mit automatisierten, spezifikationsbasierten Tests die gesamte Arbeit erledigen zu lassen.Für Java siehe ScalaCheck und das Reduktion Rahmen, der in der enthalten ist Funktionales Java Bibliothek.Bei automatisierten spezifikationsbasierten Test-Frameworks geben Sie eine Spezifikation der zu testenden Methode an (eine Eigenschaft, die wahr sein sollte) und das Framework generiert automatisch Tests und Scheinobjekte.

Die folgende Eigenschaft testet beispielsweise die Math.sqrt-Methode, um festzustellen, ob die Quadratwurzel einer beliebigen positiven Zahl n im Quadrat gleich n ist.

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

Wenn du anrufst propSqrt.check(), ScalaCheck generiert Hunderte von Ganzzahlen und überprüft Ihre Eigenschaft für jede, wobei auch automatisch sichergestellt wird, dass die Randfälle gut abgedeckt werden.

Obwohl ScalaCheck in Scala geschrieben ist und den Scala-Compiler erfordert, ist es einfach, Java-Code damit zu testen.Das Reductio-Framework in Functional Java ist eine reine Java-Implementierung derselben Konzepte.

Mockito bietet auch die Möglichkeit, Methoden zu stubbing, Argumente abzugleichen (wie anyInt() und anyString()), die Anzahl der Aufrufe zu überprüfen (times(3), atLeastOnce(), never()), und mehr.

Ich habe auch festgestellt, dass Mockito es ist einfach und sauber.

Eine Sache, die mir an Mockito nicht gefällt, ist, dass du Statische Methoden können nicht gestoppt werden.

Für etwas anderes könnten Sie es verwenden JRuby Und Mokka die in zusammengefasst sind JtestR um Tests für Ihren Java-Code in ausdrucksstarkem und prägnantem Ruby zu schreiben.Es gibt einige nützliche Spottbeispiele mit JtestR Hier.Ein Vorteil dieses Ansatzes besteht darin, dass das Verspotten konkreter Klassen sehr einfach ist.

Ich habe angefangen, Mocks über JMock zu verwenden, bin aber schließlich auf EasyMock umgestiegen.EasyMock war genau das – einfacher – und bot eine Syntax, die sich natürlicher anfühlte.Ich habe seitdem nicht mehr gewechselt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top