Как проверить метод void с помощью doAnswer от Mockito - PullRequest
0 голосов
/ 15 января 2019

Я новичок в Mockito и пытаюсь понять, как использовать doAnswer для проверки метода void .

Вот мой класс с методом onDestroy для проверки:

public class TPresenter implements TContract.Presenter {
    private CompositeSubscription viewSubscription;

    //.......

    @Override public void onCreate(.......) {
        this.viewSubscription = new CompositeSubscription();
        //.......
    }

    @Override public void onDestroy() {
        if(viewSubscription != null && !viewSubscription.isUnsubscribed()) {
            viewSubscription.unsubscribe();
    }
}

Теперь я хочу написать тест для onDestroy(), а именно, чтобы убедиться, что после выполнения onDestroy подписка отменяется. Я нашел несколько примеров использования doAnswer для тестирования void методов, например здесь , а также здесь , но я их не понимаю.

Покажите, пожалуйста, как проверить метод onDestroy.

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Тестирование пустых методов в тестируемом основном классе не является проблемой, так как не требует doAnswer.

Вот пример того, как вы можете протестировать вызов для отмены подписки.


import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;


@RunWith(MockitoJUnitRunner.class)
public class TPresenterTest {

    @InjectMocks
    private TPresenter target = new TPresenter();

    @Mock
    private CompositeSubscription viewSubscription;


    @Test
    public void onDestroyShouldUnsubscribeWhenSubscriptionNotNullAndUnsubscribed() {
        when(viewSubscription.isUnsubscribed()).thenReturn(false);

        target.onDestroy();

        verify(viewSubscription).unsubscribe();
    }

    @Test
    public void onDestroyShouldNotUnsubscribeWhenSubscriptionNotNullAndNotUnsubscribed() {
        when(viewSubscription.isUnsubscribed()).thenReturn(true);

        target.onDestroy();

        verify(viewSubscription, never()).unsubscribe();
    }
}

0 голосов
/ 20 января 2019

Как я уже упоминал в своем комментарии к ответу @GhostCat, мой пример на самом деле не тестируется из-за «нового» экземпляра класса CompositeSubscription. Мне бы пришлось пересмотреть это, и комментарий @GhostCat к его / ее ответу показывает способ сделать это.

0 голосов
/ 15 января 2019

Обычный способ проверки onDestroy() основан на том, что viewSubscription - это поддельный объект. И тогда вы бы сделали что-то вроде:

@Test
public testOnDestroyWithoutUnsubscribe() {
  when(mockedSubscription.isUnsubscribed()).thenReturn(false);
  //... trigger onDestroy()
  verifyNoMoreInteractions(mockedSubscription);
}

@Test
public testOnDestroyWithUnsubscribe() {
  when(mockedSubscription.isUnsubscribed()).thenReturn(true);
  //... trigger onDestroy()
  verify
  verify(mockedSubscription, times(1)).unsubscribe();
}

Другими словами: вы создаете смоделированный объект и настраиваете его на оба возможных пути. Затем вы проверяете, что ожидаемые действия были выполнены (или нет, именно так поступает первый тестовый пример: убедитесь, что вы не отменили подписку).

Конечно, вы не можете протестировать случай "объект подписки равен нулю" (кроме того, что он равен нулю и не гарантирует, что NPE не будет выброшен при запуске onDestroy()!

Учитывая комментарий ОП: здесь не обязательно использовать насмешку. Но когда вы хотите проверить метод void, ваши возможности довольно ограничены. Вы должны наблюдать побочные эффекты как-то!

Если вы можете получить немодированный экземпляр viewSubscription, чтобы сделать это, хорошо, тогда сделайте это. Но если нет, то каким-то образом вставка смоделированного экземпляра - ваш следующий лучший выбор. Как сделать «внедрение зависимостей», зависит от конкретного контекста, например, от используемых вами сред насмешек / тестирования.

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