2016-02-03 45 views
0

我有三個類A,B和C其中A是抽象類,B也是抽象類,B擴展A和C是非抽象的它擴展了B.我有名稱爲AddressService的變量,它在類B中是公共的,並且在類A中是私有的。我正在編寫一個類C的測試用例,它是非抽象的,並且調用了A類和A類中的方法我需要設置用於調用方法的AddressService addressService變量的值。 AddressService是有方法的接口,我調用我的超A級以下的方法之一是我的代碼如何使用mockito或powermockito設置超級類中的私有變量的值

這裏是我的測試類

@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(); 
    } 
} 

我嘗試設置的值地址服務addressService存在於類A中,它以多種方式抽象,但值仍然爲空,並且我得到NullPointer異常。

以下幾種不同的方式

1.Whitebox.setInternalState(handler, AddressService.class, addressService); 

當我設置這樣的值未設置,併爲空,給我的NullPointerException

2.MemberModifier.field(A.class, "addressService").set(A.class, addressService); 

當我設置這種方式,我得到下面的異常

java.lang.IllegalArgumentException:無法將AddressService字段A.addressService設置爲java.lang.Class

3.Whitebox.setInternalState(A.class, AddressService.class, addressService); 

當我設置這種方式,我得到下面的異常

org.powermock.reflect.exceptions.FieldNotFoundException:沒有靜態字段從「AddressService」分配可以在A.

的類層次結構中找到
4.Whitebox.setInternalState(A.class, "addressService", addressService); 

當我設置這種方式,我得到下面的異常

org.powermock.reflect.exceptions.FieldNotFoundException:沒有命名靜態字段「addressService」可以在類票數發現答:

有沒有一種方法可以使用Mockito或PowerMockito設置超級類中存在的私有變量的值。請幫助

回答

0
MemberModifier.field(A.class, "addressService").set(A.class, addressService); 

這是錯誤的:如果你想設置一個非靜態方法,而不是類java.lang.reflect.Field.set需要你的類的實例。可能仍然無法正常工作,也許你將不得不在場上第一次使用setAccessible(true)

Field field = MemberModifier.field(A.class, "addressService"); 
field.setAccessible(true); 
field.set(c, addressService); 

你可以做純反射安韋第一線......

Field field = A.class.getDeclaredField("addressService"); 
field.setAccessible(true); 
field.set(c, addressService); 

不過,當然,大神祕的是:爲什麼你有兩次相同的變量?聞起來像不好的代碼。讓內在的一個受到保護而不是靜態的,兩個人之間很可能會有好的事情發生。

+0

根據您的代碼字段。set(a,addressService);這個「a」是什麼, –

+0

的值是多少,「a」的值是多少。它是A類的實例嗎?另外我的課A是抽象的,因爲我已經提到過 –

+0

對不起,應該是「c」,因爲你的對象c是我們需要的A對象。 –

相關問題