2011-05-19 43 views
3

我是PowerMock的新手,无法找到符合我的情况的示例。模拟最终课程:powermock + easymock + testng

这没什么复杂的 - 我试图用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; 
    } 
} 

而这里的测试类:

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) 
     ... 

我在想什么?在此先感谢您的帮助!!!

回答

1

这里有一些选择:

  • 引入新的接口MyFinalClass和嘲笑这个接口来代替。
  • 如果您无权编辑MyFinalClass,则可以使用包装对象,该对象代表MyFinalClass,并在测试中模拟包装器对象。
  • 我不知道用“powermock + easymock + testng”直接嘲笑最终课程是否可行,但在我看来可以通过反射来改变最终属性。所以也许有更好的解决方案。
相关问题