将不同类的Object作为参数传递给同一方法

时间:2015-10-19 19:34:50

标签: java

我们说我有三个A,B,C类。 这三个人做同样的事情,但是以不同的方式,他们的效率不同。 所有方法名称,三个类中的变量名都是相同的。

class A{
  public static int method(){
   ......
   return result;
  }
}
class B{
  public static method(){
   ......
   return result;
  }
}
class C{
  public static method(){
   ......
   return result;
  }
}

我有测试类,它有一个方法来测试上面三个类中的代码。由于此testMethod()对于所有三个类都是通用的,有没有办法使用classes A,B,C的对象调用此方法?

class Test{
   public static int testMethod(Object ABC)
   {
       return ABC.method();
   }

   public static void main(String[] args){
      A a = new A();
      SOP(testMethod(a));
      B b = new B();
      SOP(testMethod(b));
      C c = new C();
      SOP(testMethod(c));
   }
}

我能想到的唯一方法是为每个类创建三种不同的方法,比如这样。

class Test{
   public static int testMethodA(A a)
   {
       return a.method();
   }

   public static int testMethodB(B b)
   {
       return b.method();
   }

   public static int testMethodC(C c)
   {
       return c.method();
   }

   public main() 
   {
       //call to each of the three methods
       ............
   }

这种情况的最佳方法是什么?基本上我想只有一个方法可以测试所有三个类。

1 个答案:

答案 0 :(得分:3)

使用所有类的公共方法创建一个接口。然后,让每个类实现此接口。在测试代​​码中,使用接口作为参数类型,并将每个类的实例传递给方法。请注意,执行此操作时,要测试的方法不应该是静态的。

在代码中:

public interface MyInterface {
    //automatically public
    int method();
}

public class A implements MyInterface {
    @Override //important
    //not static
    public int method() {
        /* your implementation goes here*/
        return ...;
    }
}

public class B implements MyInterface {
    @Override //important to check method override at compile time
    public int method() {
        /* your implementation goes here*/
        return ...;
    }
}

//define any other class...

然后测试:

public class Test {
    //using plain naive console app
    public static void main(String[] args) {
        MyInterface myInterfaceA = new A();
        testMethod(myInterfaceA);
        MyInterface myInterfaceB = new B();
        testMethod(myInterfaceB);
        //and more...
    }

    public static void testMethod(MyInterface myInterface) {
        myInterface.method();
    }
}

或者如果您更喜欢使用JUnit:

import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;

public class MyInterfaceTest {
    MyInterface myInterface;

    @Test
    public void methodUsingAImplementation() {
        myInterface = new A();
        //code more human-readable and easier to check where the code fails
        assertThat(myInterface.method(), equalTo(<expectedValue>));
    }
    //similar test cases for other implementations
}