Statische Initialisierer nicht während der JUnit-Tests laufen

Frecklefoot:

Ich habe ein interessantes JUnit Problem hier (JUnit 4.12). Ich habe eine Basisklasse , die nur statische Methoden hat. Sie müssen statisch sein, wegen der Art , wie sie es gewohnt sind. Ich erben andere Klassen von der Basisklasse. Also, wenn die Basisklasse ist Base, haben wir ChildAund ChildB.

Die meisten Methoden sind in der Basisklasse enthalten, aber es hat zu wissen, welches Kind es ist eigentlich (Aufruf nur die Methoden, wie die Basisklasse ist ungültig). Dies geschieht über ein statisches Datenelement in der Basisklasse getan:

public class Base {

    protected static ChildType myType = ChildType.Invalid;
    ...
}    

Jedes Kind legt das Datenelement über einen statischen Initialisierer, also:

static {
    myType = ChildType.ChildA;
}

Dann, wenn die Methoden aufgerufen werden, weiß die Basisklasse, welche Art es ist, und lädt die entsprechenden Konfigurationen (die Art ist eigentlich ein Konfigurationsname).

Das alles funktioniert perfekt, wenn die Anwendung ausgeführt wird. Stepping durch sie im Debugger und durch Log-Meldungen, kann ich die entsprechenden Arten festgelegt und die Methoden laden die entsprechenden Konfigurationen auf der Grundlage des Kindes Art sehen.

Das Problem entsteht, wenn JUnit verwenden. Wir haben einige JUnit-Tests jeder der Basisklasse Methoden zu testen. Da nur auf die Basisklasse die Methoden aufrufen ungültig ist, rufen wir die Methoden für die untergeordneten Klassen, also:

bool result = ChildA.methodTwo();

Diese ‚‘ nicht immer ‚‘. Warum? Die statische Initialisierer wird nie genannt. Wenn Sie den Code als eine Anwendung ausgeführt wird, wird es genannt, und jeder ist glücklich. Wenn ich es als JUnit Test ausführen, ist der statische Initialisierer übersprungenen und die Methoden haben ungültige Daten. Was ist JUnit tun, dass die statische Initialisierer überspringt? Gibt es eine Möglichkeit, um es?

Einzelheiten

In Wirklichkeit sind rufen wir nicht die Methode, wie ich oben geschrieben. Ich wollte nur das Beispiel so klar wie möglich sein. In Wirklichkeit haben wir einen Web Service mit dem Jersey Rahmen geschrieben. Die Methode aufgerufen wird, eine der REST-Endpunkte.

@POST
@Produces(MediaType.TEXT_PLAIN)
public String methodPost() {
    ...
    return new String( itWorked ? "success" : "fail" );
}

Und wir nennen es so (sorry über die hässliche Syntax, es ist nur so, wie es funktioniert):

@Test
public void testThePost() throws Exception {

    javax.ws.rs.core.Response response = target("restapi/").request().post(Entity.entity(null, MediaType.TEXT_PLAIN));

    assertEquals( 200, response.getStatus() );
}

Alle GET Tests Arbeit und die statische Initialisierer auf alle von ihnen genannt wird. Es ist nur diese POST, die fehlschlägt, und nur beim Ausführen des JUnit-Tests.

Frecklefoot:

Ich beschloss, zu versuchen, was @Arkdiy vorgeschlagen und haben Passthrough-Methoden in den Kinderklassen.

Lassen Sie mich wiederholen: der Code, wie ich es hatte, perfekt funktioniert , wenn als Anwendung ausführen. Erst wenn über JUnit läuft nicht versagt es .

So, jetzt habe ich etwas Ähnliches wie die folgende Liste:

public class BaseClass {

    protected static ChildType myType = ChildType.Invalid;

    ...

    public static boolean methodTwoBase() {
        ...
    }
}

public class ChildA extends BaseClass {

    public static boolean methodOne() {
        ...
    }

    public static boolean methodTwo() {

        myType = ChildType.ChildA;
        return methodTwoBase();
    }
}

public class ChildB extends BaseClass {

    public static boolean methodOne() {
        ...
    }

    public static boolean methodTwo() {

        myType = ChildType.ChildB;
        return methodTwoBase();
    }
}

Da ich nicht statische Methoden außer Kraft setzen kann, muss die Version der Methode in der Basisklasse eine andere Signatur ( methodTwoBase()statt methodTwo). Ich habe versucht , es als eine regelmäßige Anwendung und in JUnit und es funktioniert in beiden Richtungen.

Art ein interessantes Problem, und ich Schuld JUnit. Vielen Dank für den Input!

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

android JUnit Tests laufen nicht

putItem (itemRequest) funktioniert während des JUnit-Tests, jedoch nicht während des Tests auf der AWS Lambda-Konsole

Tests laufen nicht mit Junit 5 und Maven

Maven: Wie einige Tests nach der „install“ Phase während einer laufen „release: Vorbereitung“?

Lassen Sie den nodeJs-Server laufen, während Sie den Rest der Tests ausführen

Der Kolben kann während der Initialisierung nicht laufen und anhalten

Tests unter JUnit 4 laufen, aber nicht JUnit 5 - Kompiliert sauber, aber 0 Tests ausführen

Senke in Actor, der während der Produktion aufgerufen wurde, aber nicht während des Tests

Statische Initialisierung der finalen Variablen (in Java) während Kotlin CI Tests falsch

Swift: So laden Sie AppDelegate während der Tests nicht

Flatter `showModalBottomSheet` Ticker wurde während der Tests nicht entsorgt

Statische Initialisierer von nicht verwendeten globalen

Der statische Initialisierer wird für eine abgeleitete Klasse nicht aufgerufen

Rekursive Initialisierung: Der statische Initialisierer wird nicht aufgerufen, wenn ich auf das Feld Klasse zugreife

Firebase-Callbacks funktionieren während des Tests, aber nicht während der Laufzeit

Java GC: Statische Variablen, die während der gesamten Lebensdauer der Anwendung nicht gültig sind

Statische Initialisierer?

Warum kann dies nicht verwendet werden, während die statische Schnittstellenmethode von der Standardschnittstellenmethode aufgerufen wird?

Die statische Windows C ++ - Bibliothek kann während der Initialisierung nicht auf externe Methoden zugreifen

ResourceBundle kann während des Junit-Tests nicht geladen werden

Resharper Unit Tests laufen nicht

Lass einige Tests nicht laufen

Ich kann die ionische App nicht zum Laufen bringen (während der Entwicklung), wenn ich WLAN ausschalte

Die automatische Konfiguration der Couchbase während der Tests kann nicht verhindert werden

Warum wird der statische Initialisierer einer Unterklasse nicht aufgerufen, wenn eine in ihrer Oberklasse deklarierte statische Methode für die Unterklasse aufgerufen wird?

Sollte IO während der Weitergabe inline laufen?

Während der Hadoop-Installation kann kein Garn laufen

Die Ansichtshierarchie kann während der Ausführung von UI-Tests nicht erfasst werden

NgRx-Test - Abonnieren Sie den Rückruf, der während des Tests nicht aktualisiert wird

TOP Liste

  1. 1

    So legen Sie mit dem Interface Builder unterschiedliche führende Speicherplätze für unterschiedliche Geräte fest

  2. 2

    Fügen Sie eine weitere Schaltfläche zu gwt Suggest Box hinzu

  3. 3

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  4. 4

    Wie kann ich in SCSS mehrere Klassen zu einer einzigen kombinieren?

  5. 5

    Wie konvertiert man einen Datenrahmen im langen Format in eine Liste mit einem geeigneten Format?

  6. 6

    Speichern Sie ein MPAndroidChart-Diagramm in einem Bild, ohne es in einer Aktivität anzuzeigen

  7. 7

    Gruppieren Sie Datenrahmenspalten nach ihrem Datum (die Spaltentitel enthalten) und fassen Sie die Instanzen von Einsen und Nullen in R . zusammen

  8. 8

    Tomcat - Leiten Sie den alten Kontextstamm zum neuen Kontextstamm um

  9. 9

    Eclipse Oxygen - Projekte verschwinden

  10. 10

    Wie wählt man Unterschiede mit drei Tabellen aus?

  11. 11

    Tic Tac Toe-Spiel im React-Reset-Button funktioniert nicht

  12. 12

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  13. 13

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

  14. 14

    Wie kann ich den Kaskadenmodus global einstellen?

  15. 15

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  16. 16

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  17. 17

    Wie erstelle ich einen neuen übergeordneten Knoten außerhalb der .ref (/ path) in der Firebase-Echtzeitdatenbank mithilfe von Cloud-Funktionen (Typescript)?

  18. 18

    Was ist schneller: SUM über NULL oder über 0?

  19. 19

    Wie kann ich eine verschachtelte Schleife mit lapply in R ersetzen?

  20. 20

    Kann ich ein Tkinter-Canvas erstellen, das mehrere Zeilen in einem Text-Widget umfasst?

  21. 21

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

heißlabel

Archiv