2017-02-15 6 views
2

Ich bin Lesung Buch Effective Jave, in Item 13: Minimize the accessibility of classes and members, erwähnt, dass:Wie können wir Paket-private Klasse testen?

Tests zu erleichtern, Sie könnten versucht sein, eine Klasse, Schnittstelle oder Mitglied zugänglicher zu machen. Das ist bis zu einem gewissen Punkt in Ordnung. Es ist akzeptabel, ein privates Mitglied eines öffentlichen Klassenpakets - privat - zu erstellen, um es zu testen, aber es ist nicht akzeptabel, die Erreichbarkeit höher als das zu erhöhen. Mit anderen Worten, es ist nicht akzeptabel, eine Klasse, Schnittstelle oder ein Mitglied zum exportierten API der Pakete zu machen, um das Testen zu erleichtern.

Ich weiß, dass wir Mitglieder kapseln sollten, Informationen von Kunden zu verstecken, können wir sie testen, indem Sie die Klasse mit Getter und Setter zugreifen, aber Wie soll ich das verstehen Klasse Paket-private zugänglich machen, wenn ja, wie es zu testen ?

Antwort

1

Ich denke, was der Autor bedeutet, dass anstelle von

package my.package; 

class TestableClass { 
    private String property; 
} 

Sie die Sichtbarkeit ändern können

package my.package; 

class TestableClass { 
    String property; 
} 

Mit der zweiten Implementierung Sie die Eigenschaft von einem Test im Paket zugreifen können my.package wie

package my.package; 

class TestableClassTest { 
    // ... 
} 

Zur gleichen Zeit kann eine Unterklasse nicht Zugriff auf die Eigenschaft - das ist der Vorteil im Vergleich zu protected.

+0

Michael, danke für Ihre Antwort. Ich habe darüber nachgedacht, aber es ist nicht bequem, alle Tests automatisch auszuführen. Leider ist es nicht möglich, die Testklassen-Dateien in ein anderes Paket zu trennen. +1 für Sie – haifzhan

1

Grundsätzlich bedeutet dies, dass Ihre Testerklasse im selben Paket wie Ihre getestete Klasse liegen sollte. Das würde Ihre getestete Klasse und alle paketgeschützten Member und Methoden Ihrer Testklasse zugänglich machen. Die Klassen befinden sich möglicherweise unter verschiedenen Wurzeln: Ihre getestete Klasse befindet sich möglicherweise unter src/myrootpackage.first.second.MyClass und Ihre Testklasse befindet sich möglicherweise unter test/myrootpackage.first.second.MyClass.Tester

+0

es macht Sinn und wahrscheinlich ist es die einzige Möglichkeit, Test auf das Paket-Privatunterricht zu tun. Vielen Dank! +1 – haifzhan

+0

Meine aktuelle Einstellung folgt 'src.main.java.myrootpackage.first.MyClass.java' und' src.test.java.myrootpackage.first.test.MyClassTest.java', aber die Testklasse kann das nicht finden Quellklasse. Wenn ich den 'test' entferne und den Testfall unter' src.test.java.myrootpackage.first.MyClassTest.java' platziere, funktioniert es. –

+0

Sie haben Recht, wenn Ihre Methode, die Sie testen möchten, als geschützt (oder Paket privat, d. H. Kein Schlüsselwort) definiert ist, dann muss sich Ihre Testklasse im selben Paket befinden. In Ihren Einstellungen sind Teile des Pfades "src.main.java" und "src.test.java" nicht Bestandteil des Pakets. Also hatten Sie Ihre Klasse im Paket "myrootpackage.first" und Ihre Testklasse in "myrootpackage.first.test". Sobald Sie Ihre Testklasse in "myrootpackage.first" verschoben haben, werden die geschützten oder privaten Paketmitglieder Ihrer Klasse angezeigt. Außerdem können Sie das Paket in der ersten Zeile Ihrer Klasse "package myrootpackage.first" sehen –

Verwandte Themen