Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
模拟最终类:powermock+;easymock+;testng_Testng_Final_Easymock_Powermock - Fatal编程技术网

模拟最终类:powermock+;easymock+;testng

模拟最终类:powermock+;easymock+;testng,testng,final,easymock,powermock,Testng,Final,Easymock,Powermock,我是PowerMock新手,找不到与我的情况相匹配的示例 这并不复杂——我正在尝试使用PowerMock+EasyMock在TestNG测试中模拟最后一个类 这是最后一节课: public final class MyFinalClass { private String myString = "someString"; public final String getMyString() { return myString; } } public cl

我是PowerMock新手,找不到与我的情况相匹配的示例

这并不复杂——我正在尝试使用PowerMock+EasyMock在TestNG测试中模拟最后一个类

这是最后一节课:

public final class MyFinalClass {
    private String myString = "someString";

    public final String getMyString() {
        return myString;
    }
}
public class MyActiveClass {
    private MyFinalClass finalClass;

    public String getFinalString() {
        return finalClass.getMyString();
    }

    public void setFinalClass(MyFinalClass finalClass) {
        this.finalClass = finalClass;
    }
}
被测试的类将委托给最终类的一个实例:

public final class MyFinalClass {
    private String myString = "someString";

    public final String getMyString() {
        return myString;
    }
}
public class MyActiveClass {
    private MyFinalClass finalClass;

    public String getFinalString() {
        return finalClass.getMyString();
    }

    public void setFinalClass(MyFinalClass finalClass) {
        this.finalClass = finalClass;
    }
}
下面是测试类:

import static org.easymock.EasyMock.expect;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.testng.PowerMockTestCase;
import org.testng.Assert;
import org.testng.annotations.Test;


@PrepareForTest({ MyFinalClass.class })
public class MyTestClass extends PowerMockTestCase {

    private MyActiveClass activeClass = new MyActiveClass();
    private MyFinalClass mockFinalClass;

    @Test
    public void getFinalString() {
        String expectedString = "mockedReturnString";
        mockFinalClass = PowerMock.createMock(MyFinalClass.class);
        activeClass.setFinalClass(mockFinalClass);
        expect(mockFinalClass.getMyString()).andReturn(expectedString);
        PowerMock.replayAll();
        Assert.assertEquals(activeClass.getFinalString(), expectedString);
        PowerMock.verifyAll();
    }
}
但是当我运行测试时,我得到一个非法参数异常,抱怨MyFinalClass不是接口:

FAILED: getFinalString
java.lang.IllegalArgumentException: MyFinalClass is not an interface
    at java.lang.reflect.Proxy.getProxyClass(Unknown Source)
    at java.lang.reflect.Proxy.newProxyInstance(Unknown Source)
    at org.easymock.internal.JavaProxyFactory.createProxy(JavaProxyFactory.java:24)
    at org.easymock.internal.MocksControl.createMock(MocksControl.java:51)
    at org.powermock.api.easymock.PowerMock.doCreateMock(PowerMock.java:2212)
    at org.powermock.api.easymock.PowerMock.doMock(PowerMock.java:2163)
    at org.powermock.api.easymock.PowerMock.createMock(PowerMock.java:89)
    at MyTestClass.getFinalString(MyTestClass.java:22)
         ...
我错过了什么?提前感谢您的帮助

以下是一些选项:

  • 为MyFinalClass引入一个新接口,并模拟该接口
  • 如果您没有编辑
    MyFinalClass
    的权限,您可以使用一个包装器对象,它将委托给
    MyFinalClass
    并在测试中模拟包装器对象
  • 我不知道使用“powermock+easymock+testng”是否可以直接模拟final类,但在我看来,可以通过反射更改final属性。所以也许有更好的解决办法