我使用的是EasyMock 2.4,由于依赖性,无法升级到最新版本。 我需要模拟抽象类,但不能使用createMock方法。 它抛出一个错误,即类不是接口。
有人可以帮我解决这个问题吗?
有一个名为ClassA的抽象类(我无法修改此类):
public abstract class ClassA {
}
还有另一个模拟ClassA的MyTest类:
public class MyTest {
private ClassA mockClassA;
@Before
public void setup() {
mockClassA = createMock(ClassA.class); //Line number: 28
}
}
在运行它时,它会在createMock调用时抛出异常:
java.lang.IllegalArgumentException: ClassA is not an interface
at java.lang.reflect.Proxy$ProxyClassFactory.apply(Proxy.java:590)
at java.lang.reflect.Proxy$ProxyClassFactory.apply(Proxy.java:557)
at java.lang.reflect.WeakCache$Factory.get(WeakCache.java:230)
at java.lang.reflect.WeakCache.get(WeakCache.java:127)
at java.lang.reflect.Proxy.getProxyClass0(Proxy.java:419)
at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:719)
at org.easymock.internal.JavaProxyFactory.createProxy(JavaProxyFactory.java:13)
at org.easymock.internal.MocksControl.createMock(MocksControl.java:40)
at org.easymock.EasyMock.createMock(EasyMock.java:60)
at mypackage.MyTest.setup(MyTest.java:28)
答案 0 :(得分:0)
v3.0之前的EasyMock使用Java代理机制来创建模拟。这种机制只能为接口创建代理,所以你无法使用简单的模拟来模拟一个类(抽象类),而不至少升级到v3.0。
您有以下选择:
ClassA
子类以进行测试。但这显然是一种可能无法为您提供足够灵活性的解决方法。实际上你对你的模拟有什么期望? (例如,存根一些方法调用,或者做一些方法调用验证,其他...)
答案 1 :(得分:0)
EasyMock Class extension致力于为类或接口创建模拟对象。我使用 import static org.easymock.classextension.EasyMock。* ; 而不是 import static org.easymock.EasyMock * 强> 的 强>
答案 2 :(得分:0)
是。在EasyMock 3之前,您需要类扩展来模拟类。但是,最新的EasyMock版本没有太多依赖性(实际上只有Objenesis)。
哪一个阻止了你?