2013-09-24 108 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,请在测试中创建一个内部类,以扩展受测试的类而不更改任何行为。这个解决方案简单而优雅,因为它不需要任何额外的测试框架,也不会模拟被测试的类,这一般应该避免。 –