JUnit-Tests: aufrufen der Basisklasse protected-Methode
Hier ist meine Klasse Hierarchie
abstract Class A
{
int i = 0;
protected init (String param1, String param2)
{
//do lots of common things based on param1, param2 and save data in i
}
}
Dann gibt es 3-4 Klassen, die implementiert ich.e
Class B extends A
{
public B ()
{
super ();
}
public void performSomeAction ()
{
init (param1_specific_to_class_B, param2_specific_to_class_B); //calling parent class method
//do rest of teh random things
}
}
Nun, ich bin versucht zu schreiben Sie einen JUnit-test für die Klasse A. Grundsätzlich möchte ich testen, was init
Methode tut, richtig ist oder nicht. Ich habe versucht, diese
Class clas = A.class;
B b = new B();
Method A_init;
A_init = clas.getDeclaredMethod("init", String.class, String.class);
A_init.invoke(b, param1_specific_to_class_B, param2_specific_to_class_B);
Aber es funktioniert nicht und ich erhalte folgende exception
java.lang.IllegalAccessException: Class test.package.subpackage.ATest can not access a member of class package.subpackage.A with modifiers "protected"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
at java.lang.reflect.Method.invoke(Method.java:578)
at test.package.subpackage.ATest.initTest(ATest.java:49)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie Ihre test-Klasse im gleichen package wie die Klasse getestet. So der test-Klasse haben Zugriff auf die protected-Methode.
Andere Möglichkeit, ein bisschen mehr elegant, ist die protected-Methode zugänglich:
Hoffe, es hilft.
setAccessible(true)
. Das ist das, was ich suchteprotected
Mitglieder einer Klasse sind nicht sichtbar zu einer Klasse aus einem anderen Paket, es sei denn, es ist eine Unterklasse des ersteren.Jedoch in Ihrem Antrag die Klasse
test.package.subpackage.ATest
versucht, Zugriff auf eine geschützte Methode von einer anderen Klassepackage.subpackage
, die Ergebnisse in die Zugriffsverletzung.Versuchen Sie, die
ATest
Klasse an einem Standort, so dass sowohlA
undATest
gehören zum selben Paket.Alternativ in Ihrer Testklasse erstellen Sie eine Unterklasse von A und setzen die geschützte Methode(N) durch eine öffentliche Methode:
nun können Sie testen, init der Klasse A durch die Prüfung init der Klasse Kind.
Ich hatte ähnliche problem, aber wir lösen es, indem Sie design-Komposition statt inheritence.
Vielleicht bin ich etwas fehlt, aber, da B nicht überschreiben A. init () wird (zumindest von dem was ich sehen kann), konnte man nur gehen
Wenn B überschreiben, init(),
super.init()
. Ich würde es nennen so etwas wiecallSuperInitForUnitTests()
und Ihr klar zu machen in den Kommentaren, dass dies ein workaround für unit-Tests.