Wie den Wert der privaten variable in einer super Klasse mit mockito oder powermockito
Ich habe drei Klassen A, B und C, Wo Eine abstrakte Klasse, B ist ebenfalls eine abstrakte Klasse und B extends A und C ist nicht abstrakte erstreckt sich die B. habe ich die variable durch den Namen AddressService addressService ist die öffentlichkeit in der Klasse B und privat ist in der Klasse A. ich Schreibe einen Testfall für die Klasse C, die nicht abstrakte und ruft Methode in der Klasse A und in Klasse A, die ich brauche, um den Wert AddressService addressService variable, die verwendet wird, um eine Methode aufzurufen. AddressService ist eine Schnittstelle, die die Methoden und ich bin Berufung auf eine Methode in meinem super-Klasse A. Folgendes ist mein code
public interface AddressService{
void test();
}
public abstract class A{
private AddressService addressService = (AddressService) ServiceLocatorBeanFactory.getService(AddressService.class);
public void createDocument(){
addressService . test();
}
}
public abstract class B extends A{
public AddressService addressService = (AddressService) ServiceLocatorBeanFactory.getService(AddressService.class);
}
public class C extends B {
}
Hier ist meine test-Klasse
@RunWith(PowerMockRunner.class)
@PrepareForTest({ServiceLocatorBeanFactory.class})
public class createTest {
@SuppressWarnings("unchecked")
@Test
public void createTurnaroundDocument() throws Exception{
PowerMockito.mockStatic(ServiceLocatorBeanFactory.class);
AddressService addressService = Mockito.mock(AddressService.class);
PowerMockito.when(ServiceLocatorBeanFactory.getService(AddressService.class)).thenReturn(addressService);
C original = new C();
C handler = PowerMockito.spy(original);
handler.createDocument();
}
}
Ich habe versucht, den Wert von AddressService addressService präsentieren Sie in der Klasse Eine, die ist Abstrakt in vielfältiger Weise, aber immer noch den Wert null und ich bekomme NullPointer Exception.
Folgenden sind die verschiedenen Wege,
1.Whitebox.setInternalState(handler, AddressService.class, addressService);
Wenn ich diese Weise ist der Wert nicht gesetzt ist, und null ist, und gibt mir NullPointerException
2.MemberModifier.field(A.class, "addressService").set(A.class, addressService);
Wenn ich diese Weg, bekomme ich die folgende exception
java.lang.IllegalArgumentException: Kann nicht eingestellt werden AddressService Feld A. addressService zu java.lang.Class
3.Whitebox.setInternalState(A.class, AddressService.class, addressService);
Wenn ich diese Weg, bekomme ich die folgende exception
org.powermock.reflektieren.Ausnahmen.FieldNotFoundException: Nein statisches Feld assignable von "AddressService" konnte gefunden werden, in der Klassen-Hierarchie von A.
4.Whitebox.setInternalState(A.class, "addressService", addressService);
wenn ich diese Weg, bekomme ich die folgende exception
org.powermock.reflektieren.Ausnahmen.FieldNotFoundException: Nicht statische Feld namens "addressService" konnte gefunden werden, in der Klassen-Hierarchie von A.
Ist es eine Möglichkeit, wo wir können, setzen Sie den Wert der privaten variable vorhanden in der super-Klasse mit Mockito oder PowerMockito. Bitte helfen Sie
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist falsch:
java.lang.reflect.Field.set
muss eine Instanz der Klasse-wenn Sie möchten, eine nicht-statische Methode, nicht die Klasse. Vielleicht immer noch nicht funktioniert, vielleicht müssen SiesetAccessible(true)
auf dem Feld zuerst:Können Sie die erste Zeile mit der reinen Reflexion überhaupt...
Aber natürlich, das große Rätsel ist: Warum haben Sie die gleiche variable zweimal? Riecht wie schlechter code. Stellen Sie die innere geschützt, anstatt statisch, es ist sehr unwahrscheinlich, dass etwas gutes kommen wird aus zwei.