Есть ли способ инициализировать mocks и записывать операторы when (). ThenReturn () с помощью @ClassRule и делиться ими между различными классами тестирования - PullRequest
0 голосов
/ 09 января 2019

У меня есть несколько утилит (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
                 }
             };
          }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...