@After Mockito и verifyNoMoreInteractions - PullRequest
       5

@After Mockito и verifyNoMoreInteractions

0 голосов
/ 10 ноября 2018

Я хочу убедиться, что каждый тест проверяет все взаимодействия с его макетами, поэтому я просто добавил метод, аннотированный @After, с помощью verifyNoMoreInteractions со всеми макетами в качестве аргументов.

@After
public void after(){
  verifyNoMoreInteractions(mock1,mock2,mock3,...)
}

Это работает, но если взаимодействие происходит там, где его никто не ожидал, как узнать, какой тест проблемный?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

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

С другой стороны, @After предполагается использовать для очистки / закрытия ресурсов, используемых вашими методами испытаний.

Вам нужно пользовательское правило TestWatcher. Ниже приведен пример такого правила:

public class VerifyNoMoreInteractionsRule extends TestWatcher {

    private final List<Object> mocks = new ArrayList<>();

    public void add(Object mock){
        mocks.add(mock);
    }

    @Override
    protected void succeeded(Description description) {
        verifyNoMoreInteractions(mocks.toArray());
    }

}

Тогда вы можете использовать его в своих юнит-тестах:

@RunWith(MockitoJUnitRunner.class)
public class VerifyTest {

    @Rule
    public VerifyNoMoreInteractionsRule noMoreInteractionsRule = new VerifyNoMoreInteractionsRule();

    @Mock
    private YourMock yourMock;

    @Mock
    private AnotherMock anotherMock;

    @Before
    public void setUp(){
        // Register the mocks you want to verify after each test
        noMoreInteractionsRule.add(yourMock);
        noMoreInteractionsRule.add(anotherMock);
    }

    @Test
    public void test(){
        // Put your ordinary test code here
    }

}

Правило будет применяться к каждому тесту.

0 голосов
/ 10 ноября 2018

@After выполняется сразу после завершения каждого теста этого класса. Независимо от того, провалился ли тест или нет. Тогда, если ошибки происходят в методе @After, он может скрывать / скрывать ошибки, произошедшие в тестовом методе ...

Обратите внимание, что @AfterClass Выполняется после завершения всех тестов этого класса.

Вообще говоря, я обнаружил, что было бы неплохо разделить поведенческий тест на три части - назовите его A / A / A или назовите Given / When / Then

Организация / заданная часть: Настройка объектов и поведения

Закон или Когда: Выполнить реализацию

Утвердить или затем: Проверьте поведение и результаты (Подсказка: вот куда идет verifyNoMoreInteractions)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...