【问题标题】:How to mock the method from parent class with EasyMock如何使用 EasyMock 从父类模拟方法
【发布时间】:2013-06-04 16:06:55
【问题描述】:
public abstract class A{
    public int methodInA(String a){
         return 0;
    }
}

public class B extends A{
    String a = "ANYTHING";
    public void main(){
        int b = super.methodInA(a);
    }
}

此代码只是一个示例。我正在尝试测试B 并希望使用来自B 的参数来模拟methodINA 方法。我可以用 EasyMock 做到这一点吗?如果可以,怎么做?

【问题讨论】:

    标签: java superclass easymock


    【解决方案1】:

    这不是模拟的目的,您应该模拟 main 方法,但这会使测试变得毫无意义,因为您不会只测试 EasyMock 的实际代码。

    EasyMock(和一般的模拟)用于控制被测对象使用的对象的行为。

    在您的情况下,您唯一的选择是在测试中对 B 进行子类化,例如:

    @Test
    public void testSomething()
    {
      final int expected = 5;
    
      B b = new B()
      {
        public int methodInA(String a)
        {
          return expected;
        }
      };
    
      b.main();
    
      //Add assertions here.
    }
    

    【讨论】:

    • 就我而言,A 是许多类的父类。我想模拟 A 中的方法,这样我就可以专注于 B 并且不需要在每次为其子类编写单元测试时模拟 A 方法中的行为。就我而言,使用子类可能仍需要大量重复工作。您对此有其他解决方案吗?
    • B 的特化不需要在测试方法甚至测试类中,但您需要在某处特化 B 以实现您想要的。当您使用模拟 API 时,您实际上是在创建模拟接口/类的新实现——在接口的情况下,这是使用动态代理或使用类字节码操作完成的——其行为符合您设置的期望。如果您没有设置期望,模拟 API 不会调用类上的方法。
    • 这里的问题听起来更像是您的设计问题 - 而不是继承考虑使用组合,其中您有一个提供methodInA 的类,并且该类的实例被注入到B 的实例中。这样,您只需模拟提供 methodInA 的类并在创建 B 时注入模拟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2011-03-10
    相关资源
    最近更新 更多