Wie schreibe ich ein UT, um ein internes Objekt in einer Methode vorzuspielen?

8

Zum Beispiel habe ich eine Java-Klasse wie unten. Ich werde einen Komponententest für doWork () schreiben, also möchte ich das Verhalten von obj kontrollieren. Aber es ist offensichtlich, dass obj intern instanziiert wird.

Wie kann ich dieses UT schreiben? Jetzt benutze ich Junit + Mockito.

%Vor%

Vielen Dank im Voraus. :)

Übrigens, ich schreibe UT für die Klasse einer anderen Person. Also ich will es nicht ändern. Es wurde vollständig durch Integrationstest getestet.

    
Smartmarkey 16.09.2011, 06:27
quelle

6 Antworten

7

Wenn Sie den Code nicht ändern können, können Sie PowerMock zusammen mit Junit und Mockito verwenden, um sich über die Konstruktion neuer Objekte lustig zu machen.

%Vor%     
dMcNavish 16.09.2011, 13:33
quelle
2

Der beste Weg ist, Code zu schreiben, um das Testen zu unterstützen ( Test-Driven Development > betont dies). Im Moment ist Ihr Code so geschrieben, dass er schwierig zu testen ist.

Bitte erwägen, die Abhängigkeitsinjektion zu verwenden , weil es Ihnen hilft, sich über das abhängige Objekt lustig zu machen.

    
datalost 16.09.2011 07:46
quelle
1

Sie können nicht leicht. Ich kann mir zwei Möglichkeiten vorstellen, wie Sie das tun können und beide werden von Mockito oder jUnit nicht unterstützt, soweit mir bekannt ist:

1) Byte-Code-Manipulation mit cglib oder einer ähnlichen Bibliothek, die mäßig schwierig und wahrscheinlich ziemlich zerbrechlich wäre.

2) Alternativer Classloader. Sie können einen Klassenlader erstellen, der nach einem Versuch sucht, die OtherObject-Klasse zu laden und sie durch eine anonyme OtherObject-Klasse zu ersetzen, die Ihnen das verspottete Verhalten bietet, nach dem Sie suchen.

Die meiste Zeit sollten Sie es jedoch als Abhängigkeit behandeln. Wenn Sie das Öffnen einer Datei testen möchten, möchten Sie wahrscheinlich tatsächlich mit einer Datei testen, daher ist es wahrscheinlich in Ordnung, die konkrete Klasse zu verwenden. Wenn Sie das Verhalten einer Methode testen möchten, bei dem eine Datei als Teil ihrer Logik geöffnet wird, können Sie dies leicht in eine Abhängigkeit verschieben und dann nachspionieren. Dies ist in der Regel sinnvoll, da das, was Sie eines Tages in einer Datei speichern, möglicherweise in einer anderen Datenbank gespeichert oder an einem dritten Tag aus der Cloud abgerufen werden muss. Dadurch wird die Logik um das, was Sie mit der Datei tun, getrennt Der eigentliche Prozess des Öffnens eines Abrufs der Inhalte ist oft eine logische Trennung von Bedenken.

    
dlawrence 16.09.2011 07:11
quelle
1

Dies ist ein klassisches Beispiel, in dem Sie die Abhängigkeitsinjektion verwenden sollten.

Kurz gesagt, anstatt das Objekt (Abhängigkeit) intern zu erstellen, übergeben Sie es im Konstruktor oder verwenden eine Factory, um das zu erstellen, was Sie wollen (die Factory gibt die tatsächliche Implementierung im Produktionscode und eine andere im Test zurück). Dies gibt Ihnen die Möglichkeit, die Implementierung beim Testen zu ändern.

Sehen Sie sich die Beispiele an, die den von mir bereitgestellten Beispielen folgen oder googlen Sie nach " Java-Abhängigkeitsinjektionsbeispiel ".

    
murrekatt 16.09.2011 11:33
quelle
1

Es ist sehr einfach:

%Vor%

... bei Verwendung von JMockit .

    
Rogério 16.09.2011 12:44
quelle
0

Sie haben Ihren Code geschrieben und möchten ihn nun Unit testen. Dies ist die grundlegende Ursache für Ihre Schwierigkeit. Ich schlage einen anderen Ansatz vor.

  1. Geben Sie an, was die doWork() -Methode hinsichtlich des beobachteten Verhaltens tun soll nur über die Methoden public und protected (Getter) der Klasse ToBeTest oder die Methoden public und protected eines Objekts, das mit ToBeTest -Objekten verknüpft ist. Sehen Sie sich das Javadoc an, das mit der Java-Bibliothek geliefert wird: das beschreibt, was all diese Klassen tun, ohne die Klassen der Methoden anzugeben. Wann gibt Ihre Methode true zurück? Wann gibt es false zurück? Welche Nebenwirkungen hat es? Möglicherweise müssen Sie dazu einige Getter-Methoden hinzufügen. Sie könnten drücke diese im Javadoc für deinen eigenen Code aus .
  2. Verwenden Sie das erforderliche Verhalten, um zu entscheiden, welche Arten von Zusicherungen Sie in Ihre Komponententests einfügen können.
Raedwald 16.09.2011 11:52
quelle

Tags und Links