Наследование с помощью JUnit

1

У меня есть два класса (B & C), которые простираются от A.

Я пытаюсь написать unit тест таким образом, чтобы я мог просто передать конкретные реализации 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();
}

Кто-нибудь есть идеи о том, как это можно сделать?

  • 0
    А, В и С все бетонные. Это также зависит от того, что делает каждый экземпляр; если они делают разные вещи, имеет смысл проверить их по-разному. Если они делают то же самое, что и их родительский класс, имеет смысл просто проверить родительский класс и оставить два других в покое.
  • 0
    возгласы. А абстрактно. Исправлено выше
Показать ещё 5 комментариев
Теги:
mockito
junit4

2 ответа

2
Лучший ответ
@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()}
        );
    }
}
-1

Я переименовал ваш класс 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();
    }
}
  • 0
    Обратите внимание, что это может только проверить, что метод может быть вызван без исключения. Ваш testrunner отметит его ошибкой, если метод реализации выдает исключение. Я считаю, что это проще, чем добавлять логику, чтобы убедиться, что исключение не выдается.
  • 0
    Не хочешь объяснить отрицательный голос?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню