2009-08-21 11 views
3

Ich habe ein NetBeans-Projekt eingerichtet mit einer Reihe von Quellklassen und etwa 10 jUnit Testklassen in einem separaten Test Ordner.Netbeans - Quellklassen haben keinen Zugriff auf Testklassen?

In den Testdateien kann ich jede andere Testdatei oder Quellklasse importieren. In den normalen Quelldateien verhält sich NetBeans jedoch so, als ob die Test-Klassen nicht existieren würden. Automatische Vervollständigung auf ihnen wird nicht funktionieren, und wenn ich versuche, sie zu verwenden, erhalte ich einen Kompilierungsfehler.

Ich verstehe, dass es normalerweise keinen Sinn macht, eine Test-Klasse aus der regulären Quelle zu verwenden, aber ich habe einen guten Grund in diesem Fall. Ein Teil meines Programms akzeptiert einen Klassennamen als String und erstellt und Instanz davon mit Reflektion. Einer meiner jUnit-Tests ruft diese Methode auf, um sie zu testen, und übergibt ihr den Namen einer Test-Klasse. Dies schlägt immer fehl, weil der normale Programmcode keine der Klassen aus dem Ordner Test finden kann.

+0

Könnten Sie den Stacktrace posten? Vielleicht ist das wirkliche Problem ein Tippfehler in dem Klassennamen, den Sie gerade weitergeben? Ich hätte erwartet, dass sie zur Laufzeit in demselben Klassenpfad laufen, daher sollte es möglich sein, durch Reflexion auf die Testklassen zurückzukommen. Ich frage mich, ob hier noch etwas anderes vor sich geht. – jsight

Antwort

2

Während des Tests enthält der Klassenpfad die Quellen- und Testklassen. Sie müssen, und ich glaube nicht, dass es wirklich möglich wäre, zu verhindern, dass man zur Laufzeit auf den anderen zugreift, selbst mit Klassenladern. Ich bezweifle sehr, dass Netbeans es tut, auch wenn es theoretisch möglich ist.

Es gibt zwei Möglichkeiten, die ich erraten könnte. Einer ist, dass der Fehler nicht das ist, was Sie denken, dass es ist. Wenn Sie einen Stack-Trace buchen, können wir Ihnen dabei helfen.

Der andere ist, dass Sie den falschen Klassenlader verwenden, um die Klasse zu laden (d. H. Nicht nur Class.forName()). Kannst du den Code snippit beim Laden der Klasse posten?

6

Ich bin nicht sicher, ob dies die Mehrheitsmeinung sein wird, aber hier ist meine Annahme: Wenn Ihr Programm fehlschlägt, weil Sie nicht auf die Testklassen von Ihren Quellklassen zugreifen können, tun Sie etwas falsch. Es ist mir egal, wenn du denkst, dass du einen guten Grund hast, tust du nicht. (Well I denke, dass Sie nicht.)

Vielleicht müssen Sie eine Testklasse in das eigentliche Projekt verschieben. Oder in Ihrem Fall müssen Sie möglicherweise den Klassenpfad zum Testen konfigurieren ... Ich kann nicht definitiv sagen, wie ich Ihnen empfehlen würde, die Situation zu lösen, ohne Zugriff auf Ihren Code zu haben. Aus der Sicht der Quellklassen sollten die Testklassen wirklich nicht existieren, es sei denn, das Projekt wird getestet.

+0

Ich denke, ich war nicht ganz klar. Dieses Problem tritt während des Testens auf.Ich habe einen jUnit-Test, der eine Methode testet, um Klassen basierend auf einem als String übergebenen Klassennamen zu instanziieren. Die Klasse, die ich während des Tests instanziieren möchte, ist eine andere Testklasse, die nicht in der regulären Quelle enthalten sein sollte. – takteek

+0

Einverstanden. Wenn Sie reflection verwenden, um auf die Klasse zuzugreifen, dann sollten Sie keinen spezifischen Verweis auf die Klasse haben, die geladen wird. In diesem Fall sollten Sie keinen Kompilierungsfehler erhalten, stattdessen sollten Sie einen Laufzeitfehler erhalten. – Zoidberg

+0

Das ist mit David vereinbart ... – Zoidberg

0

Ich stieß auf ein sehr ähnliches Problem und entdeckte schließlich, dass die im Test-Ordner implementierten Mock-Objekte einfach nicht kompiliert wurden, weil ich sie niemals direkt instantiierte. Mit anderen Worten, würde mein Code hier fehl:

Class gatewayClass = Class.forName(System.getProperty("com.ov.MockGateway")); 

Auch wenn ich test/com/ov/MockGateway.java richtig eingestellt hatte. Da ich nicht explizit eine Instanz von MockGateway erstellte, übersprang NetBeans das Kompilieren. Wenn ich die Datei manuell kompiliert habe, indem ich sie aus der Projektansicht ausgewählt und F9 gedrückt habe, lief mein Test gut.

Meine Behelfslösung war der folgenden Code in meinen Unit-Test hinzufügen, NetBeans zwang die Mock-Objekt-Klasse zu kompilieren:

public void doNothing() { 
    // Force the compiler to build MockGateway.class 
    // by including a do-nothing reference to it. 
    MockGateway mock = new MockGateway(); 
} 
Verwandte Themen