2013-09-24 156 views
1

如果類的構造函數是受保護的,當我做測試的情況下,我能做些什麼來構建使用了EasyMock或PowerMock.this對象是我的源代碼:如何測試受保護的方法

protected TibOperationProxy(SAPApplication sdkApp, String classRef, String getOperationName, String rpcRef, SAPReqRespImpl sapClient) 
throws MException { 
    super(sdkApp, classRef, getOperationName, rpcRef); 
    this.sdkApp = sdkApp; 
    this.client = sapClient; 
} 
+0

創建一個模擬你不需要指定類的構造函數,它的EasyMock.createMock(TibOperationProxy.class),或類似 –

+0

但我想測試構造方法 – Bort

回答

2

你有powerMock白盒類的幫助:

TibOperationProxy proxy = org.powermock.reflect.Whitebox.invokeConstructor(TibOperationProxy.class, sdkApp, classRef, getOperationName, rpcRef, sapClient); 

一個額外的樣本,假設我們有類:

public class WhiteBoxTest { 
    private final String name; 
    private WhiteBoxTest (String name) { 
     this.name = name; 
    } 
    public String getName() { 
     return this.name; 
    } 
} 

而在另一大類主要方法原理:

WhiteBoxTest whitebox = Whitebox.invokeConstructor (WhiteBoxTest.class, 
      new Class[] { String.class }, new Object[] { "hello world" }); 
System.out.println (whitebox.getName()); 
+0

我使用whiteBox代理= Whitebox.invokeConstructor( TibOperationProxy.class,new Class [] {SAPApplication.class,String.class,String.class,String.class,SAPReqRespImpl.class},sdkApp,classRef,getOperationName,rpcRef,sapClient);但它會引發異常org.powermock。 reflect.exceptions.ConstructorNotFoundException:無法找到具有參數類型的構造函數:[[Ljava.lang.Class; com.tibco.sap.adapter.SAPApplication,java.lang.String,java.lang.String,java.lang。 String,com.tibco.sap.adapter.services.SAPReqRespImpl] \t at org.powermock.reflect.internal.WhiteboxImpl.invokeConstructor – Bort

+0

您可能會嘗試使用其他方法。當PowerMock無法確定要調用哪個構造函數時,用於使用私有構造函數測試類。 'invokeConstructor(java.lang.Class,java.lang.Class [],java.lang.Object [])'[api doc](http://powermock.googlecode.com/svn/docs/powermock-1.5.1 /apidocs/org/powermock/reflect/Whitebox.html) – Lifecube

+0

如何使用這種方法,我應該在第二個參數java.lang.Class []中寫什麼。我用:新類[] {SAPApplication.class,String.class,String.class,String.class,SAPReqRespIm pl.class}但不正確。 – Bort

2

如果該類有一個受保護的構造,該構造函數的目的是從派生類只能使用。也許這個班是抽象班?爲什麼不只是有一個測試派生類?

+1

+1要澄清OP,請在測試中創建一個內部類,以擴展受測試的類而不更改任何行爲。這個解決方案簡單而優雅,因爲它不需要任何額外的測試框架,也不會模擬被測試的類,這一般應該避免。 –