Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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
Java EasyMock中的模拟抽象类_Java_Unit Testing_Junit_Easymock - Fatal编程技术网

Java EasyMock中的模拟抽象类

Java EasyMock中的模拟抽象类,java,unit-testing,junit,easymock,Java,Unit Testing,Junit,Easymock,我正在使用EasyMock 2.4,由于依赖关系,无法升级到最新版本。 我需要模拟抽象类,但不能使用createMock方法。 它抛出一个类不是接口的错误 有人能帮我解决这个问题吗 有一个名为ClassA的抽象类(我无法修改该类): 还有另一个模仿ClassA的MyTest类: public class MyTest { private ClassA mockClassA; @Before public void setup() { mockClassA

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

有人能帮我解决这个问题吗

有一个名为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)

v3.0之前的EasyMock使用Java代理机制创建模拟。这种机制只能为接口创建代理,因此在不升级到v3.0的情况下,无法使用easy mock模拟类(抽象类)

您有以下选项:

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

  • 实际上,你对你的模拟有什么期待?(例如,为了存根一些方法调用,或者为了进行一些方法调用验证,其他…

    为类或接口创建模拟对象。我使用了导入静态org.easymock.classextension.easymock.*而不是导入静态org.easymock.easymock.*是。在EasyMock 3之前,您需要对模拟类进行类扩展。然而,最新的EasyMock版本并没有太多的依赖性(实际上只有objeness)


    哪一个阻止了您?

    向我们展示您尝试了什么,并发布准确的错误消息以及哪一行触发了它,谢谢。更新了代码和错误消息的问题。请提供详细信息。我们无法编译您发布在此处的代码,因为它缺少一些信息。从错误中,我猜您有类似于
    公共类ClassA
    的内容。正如错误所述,
    ClassA
    必须是一个接口,而不是一个类。请使用更多信息进一步更新代码。ClassA被定义为抽象类。
    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)