Категория JUnit — как избежать дублирования кода

#java #junit #junit4

#java #junit #junit4

Вопрос:

Допустим, у меня есть два тестовых класса, помеченных соответствующими категориями:

 @Category({CategoryA.class})
public class A {
   ...
}
  

и

 @Category({CategoryB.class})
public class B {
   ...
}
  

которые имеют общую кодовую базу и отличаются только 1 строкой метода тестирования.
Какой был бы наилучший подход, чтобы сделать этот код лучше?
Например, если я использую только один класс:

 @Category({CategoryA.class, CategoryB.class})
public class AB {
   ...
}
  

Есть ли какой-либо способ определить категорию во время выполнения и добавить простой оператор if?

Ответ №1:

По какой-либо причине у вас не может быть абстрактного класса, который выполняет большую часть работы, затем двух расширяющихся классов и имеет разные @Category аннотации? Что-то вроде:

 public abstract class ABParent {
    protected abstract void thingThatsDifferent();
}

@Category(CategoryA.class)
public class A extends ABParent {
    @Override
    protected void thingThatsDifferent() {
        System.out.println("Woof");
    }
}

@Category(CategoryB.class)
public class B extends ABParent {
    @Override
    protected void thingThatsDifferent() {
        System.out.println("Meow");
    }
}
  

Комментарии:

1. Конечно, я думал об этом, но для этого требуется иметь 3 класса вместо 1, просто для реализации этой очень простой логики

2. Well Categories — это набор, который не определяет @Category динамически. Вы могли бы расширить этот класс и заставить его делать это. Но я не думаю, что «количество классов» должно быть показателем, которым вы должны руководствоваться при написании кода лично.

3. Кроме того, @Category аннотация может относиться к отдельным методам тестирования, а не только к классу (при условии, что класс не является Parameterized тестом junit.