Правомерность использования verifynomoreinteractions () для принудительного обновления теста в будущем

Один из моих коллег использует Mockito.verifyNoMoreInteractions () в тестах JUnit, чтобы гарантировать, что возможные будущие изменения в тестируемом коде приведут к сбою теста и заставят будущих разработчиков обновлять тесты, когда они изменят тестируемый код.

Пример псевдокода:

class TestedClass {
  DependencyA dependency1;
  DependencyB dependency2;
  DependencyC dependency3;

  public void testedMethod(SomeClass a) {
    if(a == null) {
        return;
    }

    //in real code there are over a dozen of such calls, example code 
    //is simplified for clarity
    dependency1.doA();
    dependency2.doB();
    dependency3.doC();
    //future developer might add dependency3.doOtherC(); here
  }
}

class TestedClassTest {
    @Mock DependencyA dependencyAMock;
    @Mock DependencyB dependencyBMock;
    @Mock DependencyC dependencyCMock;
    @Mock SomeObject someObejctMock;

    TestedClass testedObject;

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);

        testedObject = new TestedObject(dependencyAMock, dependencyBMock, dependencyCMock);
    }

    @Test
    public void shouldCallDependencyMethods_OnTestedMethod_GivenSomeClassNotNull() {
        testedObject.testedMethod(someObjectMock);

        then(dependencyAMock).should().doA();
        then(dependencyBMock).should().doB();
        then(dependencyCMock).should().doC();

        //is this check acceptable ?
        Mockito.verifyNoMoreInteractions(dependencyAMock, dependencyBMock, dependencyCMock);
    }
}

Документация Mockito предостерегает от такой практики (https://static.javadoc.io/org.mockito/mockito-core/2.18.0/org/mockito/Mockito.html#finding_redundant_invocations):

A word of warning: Some users who did a lot of classic, expect-run-verify mocking tend to use verifyNoMoreInteractions() very often, even in every test method. verifyNoMoreInteractions() is not recommended to use in every test method. verifyNoMoreInteractions() is a handy assertion from the interaction testing toolkit. Use it only when it's relevant. Abusing it leads to overspecified, less maintainable tests

Мы говорили об этом, и он утверждал, что в случае будущих изменений в тестируемом коде (добавление новых вызовов методов зависимостей, таких как dependency3.doOtherC () в примере кода, что теоретически может произойти, но не обязательно), разработчики вводят такие изменения, вероятно, не будут помнить об обновлении тестов с соответствующей проверкой (что действительно происходило уже несколько раз в нашем проекте). Провал теста из-за обнаружения таких новых изменений с помощью verifyNoMoreInteractions () заставит их также обновить тест.

Поскольку мне поручена проверка кода, я должен занять определенную позицию в отношении такого решения. Хотя документация Mockito явно против этого, я должен признать, что вижу цель в такой «защитной» проверке в этой конкретной ситуации.

Приемлемо ли такое решение в данной ситуации? Есть ли альтернативные способы гарантировать, что тесты будут обновлены?

0
0
887
1

Ответы 1

  • TestedClass testedObject; должен быть аннотирован @InjectMock и назван cut (Class Unter Test).
  • Вы можете использовать verifyNoMoreInteractions() сколько угодно, но как и все «расширяющие» методы, вам следует по возможности избегать его. Так если функциональность не использует никаких зависимостей своего класса, вам не нужно вызывать verifyNo.. - но вы можете / могли бы, если не уверены, будет ли это повторяться вечно.

tl; dr; Использовать - или нет: точно так же, как религия или политика - каждый делает это так, как хочет (безопасно использовать, но часто перегружает)

Другие вопросы по теме