Проверка того, вызывается ли метод представления или нет в Android Studio Testing (JUnit и mockito) - PullRequest
0 голосов
/ 25 мая 2020

Извините за глупые вопросы, я новичок в тестировании в студии Android и не могу найти решения в Интернете. Я пытаюсь проверить, вызывается ли рассматриваемый метод всякий раз, когда вызывается метод в презентаторе или нет.

    @Override
    public void chooseImage() {
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        view.galleryImageSelected(intent);
    }

Приведенный выше фрагмент является методом в моем классе презентатора, и, как вы можете видеть, я я вызываю интерфейсный метод просмотра из этой функции. Теперь мне нужно проверить / проверить, что этот фрагмент работает идеально.

@RunWith(MockitoJUnitRunner.class)
public class ExampleUnitTest {

    @Mock
    private File storageDir;
    @Mock
    private PackageManager pManager;
    @Mock
    private Context appContext;
    @Mock
    private MainActivityContract.View view;
    @InjectMocks
    private MainActivityPresenter presenter;
    @Captor
    private ArgumentCaptor<Intent> captor;

    @Before
    public void setUp() throws Exception {
        presenter = new MainActivityPresenter(storageDir, pManager, appContext, view);
    }

    @Test
    public void shouldCallIntentWhenClickedOnCameraClickButton() throws IOException {

        presenter.chooseImage();
        verify(view).galleryImageSelected(captor.capture());
        Intent intent = captor.getValue();
        String action = intent.getAction();
        String type = intent.getType();

        assertThat(action, is(Intent.ACTION_GET_CONTENT));
        assertThat(type, is("image/*"));
    }

}

Теперь, чтобы проверить метод представления, я должен передать намерение в методе galleryImageSelected (), но поскольку намерение было локальной переменной, как это сделать? Я это тестирую? Должен ли я издеваться над намерением переменной, а затем передавать, и если да, как издеваться над переменной намерения.

Также, если я делаю следующее:

   @Test
    public void shouldCallIntentWhenClickedOnCameraClickButton() throws IOException {
        presenter.chooseImage();
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        verify(view).galleryImageSelected(intent);
    }

Я получаю следующая ошибка при тестировании:

Argument(s) are different! Wanted:
view.galleryImageSelected(null);
-> at com.example.imagepicker.ExampleUnitTest.shouldCallIntentWhenClickedOnCameraClickButton(ExampleUnitTest.java:52)
Actual invocation has different arguments:

1 Ответ

0 голосов
/ 25 мая 2020

Вы не можете имитировать локальную переменную, но вы можете зафиксировать переданный аргумент, используя ArgumentCaptor , а затем проверить аргумент как -

@RunWith(MockitoJUnitRunner.class)
public class PresenterTest {

  @Mock
  private View view;
  @InjectMocks
  private Presenter presenter;

  @Captor
  private ArgumentCaptor<Intent> captor;

  @Test
  public void shouldCallIntentWhenClickedOnCameraClickButton() {
    presenter.chooseImage();
    verify(view).galleryImageSelected(captor.capture());
    Intent intent = captor.getValue();
    String action = intent.getAction();
    String type = intent.getType();
    assertThat(action, is(Intent.ACTION_GET_CONTENT));
    assertThat(type, is("image/*"));
  }
}
...