EasyMock中的模拟抽象类

时间:2017-11-21 16:52:57

标签: java unit-testing junit easymock

我使用的是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)

3 个答案:

答案 0 :(得分:0)

v3.0之前的EasyMock使用Java代理机制来创建模拟。这种机制只能为接口创建代理,所以你无法使用简单的模拟来模拟一个类(抽象类),而不至少升级到v3.0。

您有以下选择:

  1. 将EasyMock升级到v3.0 +(什么阻止你的?)
  2. 与EasyMock(例如Mockito)并行使用其他模拟库
  3. 在test和override方法中创建自己的ClassA子类以进行测试。但这显然是一种可能无法为您提供足够灵活性的解决方法。
  4. 实际上你对你的模拟有什么期望? (例如,存根一些方法调用,或者做一些方法调用验证,其他...)

答案 1 :(得分:0)

EasyMock Class extension致力于为类或接口创建模拟对象。我使用 import static org.easymock.classextension.EasyMock。* ; 而不是 import static org.easymock.EasyMock *

答案 2 :(得分:0)

是。在EasyMock 3之前,您需要类扩展来模拟类。但是,最新的EasyMock版本没有太多依赖性(实际上只有Objenesis)。

哪一个阻止了你?