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

Schreibe einen Kommentar