У меня есть несколько утилит (4 утилит, если быть точным), которые я хочу протестировать с помощью Junit. Каждый из этих утилит проверяет, соответствуют ли определенные условия, и соответствующим образом устанавливает значение логической переменной.
У меня есть код setUp, помеченный @Before в каждом из этих утилит как:
when(mockObjectA.performFunction()).thenReturn(mockObjectB);
when(mockObjectB.performDifferentFunction()).thenReturn(mockObjectC);
Приведенный выше код присутствует в каждом из 4 классов утилит. Я хочу перевести их в общий класс, чтобы избежать избыточности.
Я использовал аннотацию @Rule для того же самого. Вот как это было реализовано:
@Rule
public CustomTestRules rule = new CustomTestRules();
и в моем классе CustomTestRules реализован интерфейс TestRule, в котором я переопределяю открытый метод Statement apply (Statement-оператор, Description description) для достижения того же самого.
Я не инициализировал макеты в CustomTestRules, но тесты работают нормально. Я не могу понять это странное поведение.
Я также хотел добиться того же, используя @ClassRule. Я прочитал о @ClassRule и обнаружил, что он более эффективен, чем @Rule, потому что эти операторы выполняются только один раз перед всеми методами тестирования. Я пытался добиться того же, используя @ClassRule, но методы тестирования не запускаются. (тесты даже не идентифицируются)
Ниже приведен один из методов испытаний:
@Test
public void testCondition() {
final Map<String, String> mockFilterMap = new HashMap<>();
mockFilterMap.put(key, "someValue");
final MyClassObject object = new MyClassObject();
object.setKey("incorrectValue");
when(mockObjectC.doFunction()).thenReturn(object);
final boolean doesMatch = testingFunction(mockObjectA, mockFilterMap);
Assert.assertFalse(doesMatch);
}
public class CustomTestRules implements TestRule {
@Override
public Statement apply(Statement statement, Description description) {
return new Statement() {
@Override
public void evaluate() {
//no-op
}
};
}