2016-10-11 3 views
0

Ich arbeite an einigen Integrationstests in Groovy. Es gibt ein paar hundert Tests und ich habe die Aufgabe, hartcodierte IDs zugunsten einer einzelnen Datei mit Konstanten zu entfernen. Für etwa 500 der Dateien, funktioniert alles wie erwartet (Danke, grep und sed):MissingPropertyException, obwohl es importiert wird

alt

package com.example.package.tests; 

class SomeTest extends BaseGroovyTest { 

    @Test 
    public void testSomething() {   
     def merchantId = "1234" 

     ... 
    } 
} 

neue

package com.example.package.tests; 
import com.example.package.util.ConstantMerchants 

class SomeTest extends BaseGroovyTest { 

    @Test 
    public void testSomething() {   
     def merchantId = ConstantMerchants.MERCHANT_A 

     ... 
    } 
} 
: Hardcoded-IDs haben mit einer konstanten ersetzt

ConstantMerchants

package com.example.package.util; 

public final class ConstantMerchants { 

    public static final String MERCHANT_A = "1234"; 
    public static final String MERCHANT_B = "1111"; 
    public static final String MERCHANT_C = "2222"; 
    public static final String MERCHANT_D = "3333"; 
    ... 

    private ConstantMerchants() { } 

} 

Während jedoch einige Dateien erfolgreich geändert wurden (so die hartcodierte ID wird mit einem Verweis auf ConstantMerchants ersetzt und ConstantMerchants importiert), ihre Tests können nicht aufgrund des Fehlers auszuführen:

groovy.lang.MissingPropertyException: No such property: ConstantMerchants for class: com.example.package.tests.SomeTest

I‘ Es wurde mehrmals überprüft, und die einzigen Änderungen an den Dateien sind das Hinzufügen einer Importstation für und das Ersetzen einer String-ID durch ein ConstantMerchants Pendant.

die Import-Anweisung aus- und dann eclipse es mit hinzufügen, indem Ctrl + Umschalttaste drücken + O (Organisieren Importen) Ergebnisse in der gleichen Datei, die ich vor dem Entfernen der Import-Anweisung hatte, und der Fehler immer noch auftritt.

Jede Hilfe bei der Lösung dieses Problems wäre sehr willkommen!

+0

Ist es konsistent reproduzierbar? Was sind die gdk und jdk Versionen? – Rao

+0

Dieses Problem tritt jedes Mal für die gleichen Tests auf, unabhängig davon, ob ich andere Tests zusammen mit ihnen durchführe. Ich verwende Java SE 1.7 (Ich bin nicht sicher, wie ich Ihnen eine spezifischere Version von Eclipse geben kann) –

Antwort

0

Offensichtlich eine Klasse, die von einer Klasse verwendet wurde, die von einer Klasse (...) verwendet wurde, die von meinem Test verwendet wurde, referenzierte , aber nicht ordnungsgemäß importiert.

Aus irgendeinem Grund dachte der Compiler, dass dies der Fehler der Klasse am Ende der Nutzungskette war, also sagte er ständig, dass meine Tests Referenzen fehlten, während es tatsächlich ein paar Schichten tiefer war. Durch Hinzufügen des Imports zu dieser Datei wurde das Problem behoben.

Ich fand dies schließlich durch grepping für Dateien, die ConstantMerchants enthalten, aber nicht die Import-Anweisung. Wenn jemand interessiert ist, mein grep Befehl war:

grep -L -e "import .*ConstantMerchants" $(grep -E -f /mnt/c/Data/search_replaced.txt * -rclH) 

Wo search_replaced.txt ein paar Muster enthält, die die ersetzt IDs entsprechen.

1

Sie haben erwähnt, dass Sie viele Tests ausgeführt haben und einige von ihnen fehlschlagen. Das lässt mich denken, dass es ein Abhängigkeitsproblem Ihrer Tests gibt, bedeutet vielleicht, dass einige Tests die Klasse ConstantMerchants in ihrem Import nicht korrekt haben dürfen. Gehen Sie wie folgt:

  • versuchen, die Klasse ConstantMerchants Position zu ändern, in dem alle Tests dieser Klasse einen Zugang haben.

Eine andere Sache, sollten Sie prüfen, Ihre IDE-Synchronisation:

  • löschen build Verzeichnis.
  • Erstellen Sie das Projekt neu.

Überprüfen Sie, ob das geholfen hat.

Nein, dann nach anderen Synchronisierungsproblemen der IDE suchen.

Wenn es nicht funktioniert, versuchen Sie eine andere Sache: Überprüfen Sie Ihr Bauwerkzeug, wenn es einige Einschränkungen oder eine Umgebungsvariable hat, die es für den besten Lauf benötigt.

Und tun das folgende:

  • löschen Bauverzeichnis
  • eine Synchronisation auf die Projektbibliotheken durchführen.
  • Führen Sie das Projekt erneut aus. Die meiste Zeit funktioniert es gut und kann helfen, diesen Fehler zu beseitigen.

Ich hoffe, es hilft.

+0

Vielen Dank für Ihre Antwort. Ich habe überprüft, dass die 'ConstantMerchants'-Klasse in einem Paket oberhalb der Tests liegt, das heißt, dass alle Tests darauf zugreifen können. Der Neuaufbau oder das erneute Importieren des Projekts scheint nichts zu helfen. –

+0

Haben Sie Abhängigkeiten überprüft? Die Lösungen, die ich in der Antwort hinzugefügt habe, können den Projektabhängigkeiten in jedem Fall der fehlenden Klasse usw. helfen. – Rotem

+0

Ich habe das Problem gefunden. Anscheinend eine Klasse, die von einer Klasse verwendet wurde, die von einer Klasse verwendet wurde (...), die von meinem Test verwendet wurde, referenzierte "ConstantMerchants", importierte sie aber nicht richtig. Aus irgendeinem Grund dachte der Compiler, dass dies der Fehler der Klasse am Ende der Nutzungskette sei, also sagte er immer wieder, dass meine Tests Referenzen enthielten, während es tatsächlich einige wenige Schichten tiefer war. Durch Hinzufügen des Imports zu dieser Datei wurde das Problem behoben. –

Verwandte Themen