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.
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