Аргумент (ы) разные!когда фактический метод, использующий ключевое слово this, ссылается на реализацию интерфейса - PullRequest
0 голосов
/ 21 мая 2019

Я реализую архитектуру MVP при создании своих приложений, я получаю руководство по MVP с какого-то веб-сайта. Я хочу проверить каждый метод в моем проекте. Когда я тестировал своего докладчика, произошла ошибка. Это говорит о том, что ожидаемые аргументы и фактические аргументы разные.

Я понял, что эта ошибка произошла, потому что я использую ключевое слово this в моем реальном методе. Я использую this, потому что мой докладчик реализует некоторый интерфейс (OnFinishedListener).

Вот мой код для моего докладчика и мой тест для докладчика.

MainPresenter

public class MainPresenter implements MainContract.Presenter, MainContract.Model.OnFinishedListener {
    private MainContract.View mainView;
    private MainContract.Model mainModel;
    private RetrofitServices retrofitServices;

    public MainPresenter(MainContract.View mainView, RetrofitServices retrofitServices, MainModel mainModel) {
        this.mainView = mainView;
        this.retrofitServices = retrofitServices;
        this.mainModel = mainModel;
    }

    @Override
    public void onFinished(Inquiry inquiry) {
        if(mainView != null){
            mainView.hideProgress();
            mainView.setDataToViews(inquiry);
        }
    }

    @Override
    public void onFailure(Throwable t) {
        if(mainView != null){
            mainView.hideProgress();
            mainView.onResponseFailure(t);
        }
    }

    @Override
    public void onDestroy() {
        mainView = null;
    }

    @Override
    public void requestInquiryData(Inquiry inquiry) {
        if(mainView != null){
            mainView.showProgress();
        }

        mainModel.getInquiry(this, inquiry, retrofitServices);
    }
}

MainPresenterTest

public class MainPresenterTest {
    private MainPresenter mainPresenter;
    @Mock
    RetrofitServices retrofitServices;

    @Mock
    MainContract.View view;

    @Mock
    Inquiry inquiry;

    @Mock
    Throwable throwable;

    @Mock
    MainContract.Model.OnFinishedListener listener;

    @Mock
    MainModel mainModel;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);

    }

    @Test
    public void onFinished_hideProgress_setDataToViews() {
        mainPresenter = new MainPresenter(view, retrofitServices, mainModel);

        mainPresenter.onFinished(inquiry);

        verify(view).hideProgress();
        verify(view).setDataToViews(inquiry);
    }

    @Test
    public void onFinished_doNothing_whenViewIsNull() {
        mainPresenter = new MainPresenter(null, retrofitServices, mainModel);

        mainPresenter.onFinished(inquiry);

        verifyZeroInteractions(view);
    }

    @Test
    public void onFailure_hideProgress_responseFailure() {
        mainPresenter = new MainPresenter(view, retrofitServices, mainModel);

        mainPresenter.onFailure(throwable);

        verify(view).hideProgress();
        verify(view).onResponseFailure(throwable);
    }

    @Test
    public void onFailure_doNothing_whenViewIsNull() {
        mainPresenter = new MainPresenter(null, retrofitServices, mainModel);

        mainPresenter.onFailure(throwable);

        verifyZeroInteractions(view);
    }

    @Test
    public void requestInquiryData_showProgress_getInquiryCalled() {
        mainPresenter = new MainPresenter(view, retrofitServices, mainModel);

        mainPresenter.requestInquiryData(inquiry);

        verify(view).showProgress();

        verify(mainModel).getInquiry(listener, inquiry, retrofitServices);
    }

Я хочу проверить метод requestInquiryData в моем докладчике (используя requestInquiryData_showProgress_getInquiryCalled), но эта ошибка произошла. Как проверить метод, когда метод использует ключевое слово this?

Спасибо за ваш ответ.

EDIT Это скриншот аргумента различия enter image description here

1 Ответ

0 голосов
/ 21 мая 2019

Я решаю это с помощью замены слушателя на verify(mainModel).getInquiry(listener, inquiry, retrofitServices); на verify(mainModel).getInquiry(mainPresenter, inquiry, retrofitServices);, потому что this на mainModel.getInquiry(this, inquiry, retrofitServices); ссылается на MainPresenter.java класс, а не MainContract.Model.OnFinishedListener

Я не знаю, является ли это лучшей практикой для тестирования архитектуры MVP в разработке под Android, не стесняйтесь меня поправлять. Спасибо

...