【问题标题】:Mock Abstract Class in EasyMockEasyMock 中的模拟抽象类
【发布时间】:2017-11-21 16:52:57
【问题描述】:

我使用的是 EasyMock 2.4,由于依赖关系无法升级到最新版本。 我需要模拟抽象类,但不能使用 createMock 方法来模拟。 它会抛出一个类不是接口的错误。

谁能帮我解决这个问题?

有一个抽象类叫ClassA(我不能修改这个类):

public abstract class ClassA {

}

还有另一个 MyTest 类模拟 ClassA:

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)

【问题讨论】:

  • 向我们展示您的尝试并发布确切的错误消息以及触发它的行,谢谢。
  • 更新了代码和错误信息的问题。
  • 请提供minimal reproducible example。我们无法编译您在此处发布的代码,因为它缺少一些信息。
  • 从错误中,我猜你有类似public class ClassA的东西。如错误所述,ClassA 必须是接口,而不是类。
  • 用更多信息进一步更新代码。 ClassA 被定义为抽象类。

标签: java unit-testing junit easymock


【解决方案1】:

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

您有以下选择:

  1. 将 EasyMock 升级到 v3.0+(是什么阻止了您?)
  2. 将其他模拟库与 EasyMock 并行使用(例如 Mockito)
  3. 在测试中创建您自己的ClassA 子类并覆盖那里的测试方法。但这显然是一种解决方法,可能无法为您提供足够的灵活性。

实际上,您对自己的模拟有何期望? (例如,存根一些方法调用,或进行一些方法调用验证,其他......)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      谁在阻止你?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-18
        • 1970-01-01
        • 1970-01-01
        • 2016-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多