Java JUnit的继承

Java JUnit的继承,java,mockito,junit4,Java,Mockito,Junit4,我有两个班(B&C)是从A延伸而来的 我正试图以一种我可以通过B和C的具体实现并让它们运行的方式编写一个单元测试。例如: abstract class A { abstract doSomething(); public static void send(A a){ // sends a off } } class B extends A { public void doSomething(){ this.send(this) } class C e

我有两个班(B&C)是从A延伸而来的

我正试图以一种我可以通过B和C的具体实现并让它们运行的方式编写一个单元测试。例如:

abstract class A {
  abstract doSomething();

  public static void send(A a){
      // sends a off
  }
}

class B extends A {
  public void doSomething(){
    this.send(this)
  }

class C extends A {
  public void doSomething(){
    this.send(this);
    this.write(this)
  }
  public void write(A a){
     //writes A to file
  }
}
//setup junit testsuite info
class TestClassA {

  private A theClass;

  public void testDoSomething(){
     this.theClass.doSomething();
  }
}

 // would like to be able to do
class Runner {
   B b = new B();
   C c = new C();

   // run TestClassA with b (I know this doesnt work, but this is what I'd like to do)
   TestClassA.theClass = b;
   TestClassA.run();


   // run TestClassA with c (I know this doesnt work, but this is what I'd like to do)
   TestClassA.theClass = c;
   TestClassA.run();
}
现在,我正在寻找一种抽象地进行单元测试的方法,只需传入实现并让单元测试运行即可。例如:

abstract class A {
  abstract doSomething();

  public static void send(A a){
      // sends a off
  }
}

class B extends A {
  public void doSomething(){
    this.send(this)
  }

class C extends A {
  public void doSomething(){
    this.send(this);
    this.write(this)
  }
  public void write(A a){
     //writes A to file
  }
}
//setup junit testsuite info
class TestClassA {

  private A theClass;

  public void testDoSomething(){
     this.theClass.doSomething();
  }
}

 // would like to be able to do
class Runner {
   B b = new B();
   C c = new C();

   // run TestClassA with b (I know this doesnt work, but this is what I'd like to do)
   TestClassA.theClass = b;
   TestClassA.run();


   // run TestClassA with c (I know this doesnt work, but this is what I'd like to do)
   TestClassA.theClass = c;
   TestClassA.run();
}
有人对如何实现这一目标有什么想法吗

@RunWith(参数化的.class)
@RunWith(Parameterized.class)
public class ATest {
    private A theClass;

    public ATest(A theClass) {
        this.theClass= theClass;
    }

    @Test
    public final void doSomething() {
        // make assertions on theClass.doSomething(theClass)
    }


    @Parameterized.Parameters
    public static Collection<Object[]> instancesToTest() {
        return Arrays.asList(
                    new Object[]{new B()},
                    new Object[]{new C()}
        );
    }
}
公开课考试{ 私人阶级; 公开考试(A类){ this.theClass=theClass; } @试验 公开最终无效剂量(){ //对类进行断言。doSomething(类) } @参数化。参数化 公共静态集合instancesToTest(){ 返回数组.asList( 新对象[]{new B()}, 新对象[]{new C()} ); } }
我将您的TestClassA类重命名为MyController,因为听起来MyController是测试系统的一部分。这样,您就可以用B和C类对其进行测试,如下所示:

public class HelloContTest {
    @Test
    public void testSomethingWithB() throws Exception {
        MyController controller = new MyController();
        controller.setTheClass(new B());
        controller.doSomething();
    }
    @Test
    public void testSomethingWithC() throws Exception {
        MyController controller = new MyController();
        controller.setTheClass(new C());
        controller.doSomething();
    }
}

A、 B和C都是混凝土。它还取决于每个实例正在做什么;如果他们在做不同的事情,那么以不同的方式测试他们是有意义的。如果他们正在做与父类相同的事情,那么只测试父类而不去管其他两个是有意义的。A是抽象的。固定上面他们做不同的事情,但他们在做他们在同一方法只是不同的工作流为每个实现。最后,方法签名都是一样的。首先,看起来您的测试系统就是doSomething()方法。为了测试这一点,您将需要某种类型的输出,这些输出可以被验证。一般来说,返回void的单元测试方法没有意义,除非您只是想验证它没有抛出异常,它会将某些内容保存到数据库或磁盘。我正在验证是否已完成保存。它目前没有返回任何内容。将来可能是一个布尔值。注意,这只能验证在不引发任何异常的情况下调用该方法。如果实现方法引发异常,testrunner将用错误标记它。我发现这比添加逻辑来验证没有抛出异常要简单。