Java 如何测试受保护的方法

Java 如何测试受保护的方法,java,junit,easymock,powermock,Java,Junit,Easymock,Powermock,如果类的构造函数受到保护,当我执行测试用例时,我可以如何使用EasyMock或PowerMock来构造对象。这是我的源代码: 受保护的TibOperationProxy(SAPP应用程序sdkApp、字符串classRef、字符串getOperationName、字符串rpcRef、SAPreqResImpl sapClient) 抛出异常{ super(sdkApp、classRef、getOperationName、rpcRef); this.sdkApp=sdkApp; this.clie

如果类的构造函数受到保护,当我执行测试用例时,我可以如何使用EasyMock或PowerMock来构造对象。这是我的源代码:

受保护的TibOperationProxy(SAPP应用程序sdkApp、字符串classRef、字符串getOperationName、字符串rpcRef、SAPreqResImpl sapClient)
抛出异常{
super(sdkApp、classRef、getOperationName、rpcRef);
this.sdkApp=sdkApp;
this.client=sapClient;
}

您有powerMock whitebox类来帮助:

TibOperationProxy=org.powermock.reflect.Whitebox.invokeConstructor(TibOperationProxy.class、sdkApp、classRef、getOperationName、rpcRef、sapClient);
假设我们有一个额外的示例:

另一类中的主要方法是:

WhiteBoxTest-whitebox=whitebox.invokeConstructor(WhiteBoxTest.class,
新类[]{String.Class},新对象[]{“hello world”});
System.out.println(whitebox.getName());

您有powerMock whitebox类来帮助:

TibOperationProxy=org.powermock.reflect.Whitebox.invokeConstructor(TibOperationProxy.class、sdkApp、classRef、getOperationName、rpcRef、sapClient);
假设我们有一个额外的示例:

另一类中的主要方法是:

WhiteBoxTest-whitebox=whitebox.invokeConstructor(WhiteBoxTest.class,
新类[]{String.Class},新对象[]{“hello world”});
System.out.println(whitebox.getName());


如果类具有受保护的构造函数,则该构造函数仅用于派生类。也许这个类是一个抽象类?为什么不只是拥有一个测试派生类?

如果该类有一个受保护的构造函数,那么该构造函数将仅用于派生类。也许这个类是一个抽象类?为什么不创建一个测试派生类?

要创建模拟,您不需要指定类的构造函数EasyMock.createMock(TiOperationProxy.class)或类似的东西,但我想测试构造方法要创建模拟,您不需要指定类的构造函数EasyMock.createMock(TiOperationProxy.class),或者类似的东西,但是我想测试构造方法,我使用whiteBox代理=whiteBox.invokeConstructor(TibOperationProxy.class,新类[]{SAPApplication.class,String.class,String.class,SAPreqResImpl.class},sdkApp,classRef,getOperationName,rpcRef,sapClient);但它抛出了一个异常org.powermock.reflect.exceptions.ConstructorNotFoundException:未能找到参数类型为:[[Ljava.lang.Class;,com.tibco.sap.adapter.sapplication,java.lang.String,java.lang.String,com.tibco.sap.adapter.services.sapreqresimpl]的构造函数在org.powermock.reflect.internal.WhiteboxImpl.invokeConstructory,您可以尝试使用另一种方法。当powermock无法确定要调用哪个构造函数时,这对于使用私有构造函数测试类非常有用。
invokeConstructor(java.lang.Class,java.lang.Class[],java.lang.Object[])
如何使用这个方法,我应该在第二个参数java.lang.Class[]中写些什么。我使用了:new Class[]{sapplication.Class,String.Class,String.Class,String.Class,SAPReqRespIm‌​pl.class}但不正确。是的,这是我所期望的。我创建了一个测试,它可以工作。更新了我的回复。非常感谢Lifecube,现在我可以调用构造函数,但是在构造函数中有一个sectence:super(sdkApp,classRef,getOperationName,rpcRef);我可以做什么来模拟它?我使用whiteBox代理=whiteBox.invokeConstructor(TibOperationProxy.class,新类[]{sapplication.class,String.class,String.class,sapreqresimpl.class},sdkApp,classRef,getOperationName,rpcRef,sapClient);但它引发了一个异常org.powermock.reflect.exceptions.ConstructorNotFoundException:无法找到参数类型为的构造函数:[[Ljava.lang.Class;,com.tibco.sap.adapter.sapplication,java.lang.String,java.lang.String,com.tibco.sap.adapter.services.sapreqresimpl]在org.powermock.reflect.internal.WhiteboxImpl.invokeConstructory,您可以尝试使用另一种方法。当powermock无法确定要调用哪个构造函数时,这对于使用私有构造函数测试类非常有用。
invokeConstructor(java.lang.Class,java.lang.Class[],java.lang.Object[])
如何使用这个方法,我应该在第二个参数java.lang.Class[]中写些什么。我使用了:new Class[]{sapplication.Class,String.Class,String.Class,String.Class,SAPReqRespIm‌​pl.class}但不正确。是的,这正是我所期望的。我创建了一个测试,它工作了。更新了我的回复。非常感谢Lifecube,现在我可以调用构造函数了,但是在构造函数中有一个sectence:super(sdkApp,classRef,getOperationName,rpcRef);我能做些什么来模拟它?+1要为OP澄清,请在测试中创建一个内部类,该类在不改变任何行为的情况下扩展被测类。此解决方案简单而优雅,因为它不需要任何额外的测试框架,也不模拟通常应避免的被测类。+1要为OP澄清,crea在测试中创建一个内部类,在不改变任何行为的情况下扩展被测试的类。此解决方案简单而优雅,因为它不需要任何额外的测试框架,也不模拟被测试的类,这通常应该避免。
public class WhiteBoxTest {
    private final String name;
    private WhiteBoxTest (String name) {
        this.name = name;
    }
    public String getName () {
        return this.name;
    }
}