Frage

Gibt es eine Möglichkeit zu Mockobjekt Konstruktion mit JMock in Java?

Zum Beispiel, wenn ich eine Methode als solche:

public Object createObject(String objectType) {
    if(objectType.equals("Integer") {
        return new Integer();
    } else if (objectType.equals("String") {
        return new String();
    }
}

... ist es eine Möglichkeit, die Erwartung des Objekts Konstruktion in einem Testverfahren zu verspotten?

Ich möchte in der Lage sein, die Erwartungen zu stellen, dass bestimmte Konstrukteure genannt werden, anstatt ein zusätzliches Stück Code, mit der Art zu überprüfen (wie es nicht immer so gewunden sein und einfach, wie mein Beispiel).

Also statt:

assertTrue(a.createObject() instanceof Integer);

Ich konnte eine Erwartung des bestimmten Konstruktor aufgerufen wird. Nur um es ein bisschen saubere und auszudrücken, was tatsächlich in einer besser lesbaren Art und Weise getestet werden.

Bitte geben Sie das einfache Beispiel entschuldigen, das eigentliche Problem Ich arbeite an ist ein wenig komplizierter, aber die Erwartung, die vereinfachen würde es.


Für ein bisschen mehr Hintergrund:

Ich habe eine einfache Factory-Methode, die Wrapper-Objekte erzeugt. Die Objekte eingewickelt werden können Parameter erfordern, die nur schwer in einer Testklasse zu erhalten (es ist bereits bestehende Code), so ist es schwierig, sie zu konstruieren.

Vielleicht näher an, was ich suche eigentlich für ist: Gibt es eine Möglichkeit, eine ganze Klasse zu verspotten (mit CGLIB) in einem Zuge, ohne jede Methode Angabe Stub?

So das Mock in einem Konstruktor eingewickelt wird, so kann offensichtlich Methoden auf sie genannt werden, ist JMock der Lage, dynamisch spöttisch jede Methode aus?

Meine Vermutung ist, nein, wie das ist ziemlich kompliziert wäre. Aber zu wissen, ich bin auf den Holzweg wertvolle ist auch: -)

War es hilfreich?

Lösung

Das einzige, was ich denken kann, ist die create-Methode zu haben, bei Factory-Objekt auf, was würden Sie als Mock.

Aber in Bezug auf einen Konstruktoraufruf spöttisch, nein. Mock-Objekte setzen die Existenz des Objekts, während ein Konstruktor setzen voraus, dass das Objekt nicht existiert. Zumindest in Java, wo Zuweisung und Initialisierung passieren zusammen.

Andere Tipps

JMockit kann dies tun.

Siehe meine Antwort in https://stackoverflow.com/questions/22697#93675

Ach, ich glaube, ich bin schuldig, die falsche Frage zu stellen.

Die einfache Fabrik Ich wurde zu Test versucht sah so etwas wie:

public Wrapper wrapObject(Object toWrap) {
    if(toWrap instanceof ClassA) {
        return new Wrapper((ClassA) toWrap);
    } else if (toWrap instanceof ClassB) {
        return new Wrapper((ClassB) toWrap);
    } // etc

    else {
        return null;
    }
}

Ich frage die Frage, wie zu finden, wenn „neuer ClassAWrapper ()“ genannt wurde, weil das Objekt toWrap hart war in einem isolierten Test zu erhalten. Und die Verpackung (wenn es auch so genannt werden kann) ist irgendwie seltsam, da sie die gleiche Klasse verwenden, verschiedene Objekte zu wickeln, nur unterschiedliche Hersteller verwendet [1]. Ich vermute, dass, wenn ich die Frage ein bisschen besser gefragt hätte, hätte ich erhielt schnell die Antwort:

"Sie sollten Object toWrap verspotten die Instanzen passen für Sie testen in verschiedenen Testmethoden, und überprüfen Sie das resultierende Wrapper Objekt die richtige Art zu finden ist zurückgekehrt ... und hoffen, dass Sie das Glück haben, dass Sie don‘ t haben, um die Welt zu verspotten, um die verschiedenen Instanzen zu erstellen ;-) "

ich jetzt ein okay Lösung für das unmittelbare Problem haben, Dank!

[1] eröffnet die Frage, ob dieser Refactoring werden soll, ist gut aus dem Rahmen meines aktuellen Problems: -)

Sind Sie mit Dependency Injection ?

Wenn nein, dann würden Sie ceartanly profitieren über dieses Konzept vom Lernen. Ich denke, die gute alte Inversion of Control Container und das Dependency Injection Muster von Martin Fowler dienen als eine gute Einführung.

Mit Dependency Injection (DI), würden Sie ein DI Container-Objekt haben, das in der Lage ist, alle Arten von Klassen für Sie zu erstellen. Dann wird Ihr Objekt würde die Verwendung der DI-Container macht Klassen instanziieren und Sie würden die DI-Container verspotten zu testen, ob die Klasseninstanzen der erwarteten Klassen erstellt.

Dependency Injection oder Inversion of Control.

Alternativ können Sie die Abstract Factory Design-Muster für alle Objekte, die Sie erstellen. Wenn Sie in Unit-Test-Modus sind, injizieren eine Testing-Fabrik, die Ihnen sagen, was schaffen Sie umfassen dann die Behauptung Code in der Testing-Fabrik die Ergebnisse zu überprüfen (Inversion of Control).

Um Ihren Code so sauber wie möglich schafft eine interne geschützte Schnittstelle implementieren die Schnittstelle (Ihr Werk) mit dem Produktionscode als interne Klasse zu verlassen. Fügen Sie eine statische Variable Art Ihrer Schnittstelle zu Ihrem Standard-Werk initialisiert. In statischen Setter für die Fabrik und Sie sind fertig.

In Ihrem Testcode (muss im selben Paket sein, da sonst die interne Schnittstelle muss öffentlich sein), eine anonyme oder interne Klasse mit der Behauptung Code erstellen und dem Testcode. Dann in Ihrem Test, die Zielklasse initialisieren, zuweisen (injizieren), um die Testfabrik, und die Methoden der Zielklasse ausgeführt werden.

Ich hoffe, es gibt keine. Mocks sollen Mock-Schnittstellen, die keine Konstrukteure haben ... nur Methoden.

Etwas scheint zu testen hier in Ihrem Ansatz nicht in Ordnung zu sein. Gibt es Gründe, warum Sie testen müssen, dass explizite Konstruktoren genannt werden?
Die Geltendmachung der Art des zurückgegebenen Objekts scheint für die Prüfung Fabrik Implementierungen in Ordnung. Behandeln Sie create als Blackbox .. untersuchen, was es gibt, aber das Mikro nicht, wie sie es tut. Niemand mag es, dass:)

Update auf dem Update: Ouch! Verzweifelte Maßnahmen für verzweifelte Zeiten eh? Ich wäre überrascht, wenn JMock das erlaubt ... wie ich sagte, es arbeitet an Schnittstellen .. keine konkreten Typen. So

  • Entweder versuchen und einige Mühe aufwenden, auf die lästigen Eingabeobjekten ‚instantiable‘ unter Test-Harnisch bekommen. Go Bottom up in Ihrem Ansatz.
  • Wenn das nicht machbar ist, es manuell testen, mit Haltepunkten (ich weiß, es saugt). Dann hält einen „Touch es auf eigene Gefahr“ Kommentar in einem sichtbaren Bereich in der Quelldatei und voranzukommen. Kampf an einem anderen Tag.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top