Search code examples
unit-testingmockitoandroid-mvp

Argument(s) are different! when actual method using keyword 'this' refer to interface implementation


I am implementing MVP architecture when building my apps, I get MVP tutorial from some website. I want to test every single method in my project. When I am testing my presenter, an error occurred. It tells that an expected arguments and actual arguments are different.

I figured out that that error occurred because I am using this keyword in my actual method. I am using this because my presenter implement some interface (OnFinishedListener).

Here my code for my presenter and my presenter test.

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);
    }

I want to test requestInquiryData method in my presenter (using requestInquiryData_showProgress_getInquiryCalled), but that error occurred. How to test a method when the method using this keyword?

Thank you for your answer.

EDIT This is screenshot of differences argument enter image description here


Solution

  • I solve this with replace listener on verify(mainModel).getInquiry(listener, inquiry, retrofitServices);with verify(mainModel).getInquiry(mainPresenter, inquiry, retrofitServices); because this on mainModel.getInquiry(this, inquiry, retrofitServices); references to MainPresenter.java class not to MainContract.Model.OnFinishedListener

    I don't know if this is a best practice for testing MVP architecture in android development, feel free to correct me. Thanks