论据不同!当使用关键字 'this' 的实际方法引用接口实现时
Argument(s) are different! when actual method using keyword 'this' refer to interface implementation
我在构建我的应用程序时正在实施 MVP 架构,我从某个网站获得了 MVP 教程。我想测试我项目中的每一个方法。当我测试我的演示者时,发生了一个错误。它表明预期参数和实际参数不同。
我发现发生该错误是因为我在实际方法中使用了 this
关键字。我正在使用 this
因为我的演示者实现了一些接口 (OnFinishedListener
).
这是我的演示者代码和我的演示者测试。
主讲人
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
关键字时如何测试方法?
感谢您的回答。
编辑
这是差异论证的截图
我用 verify(mainModel).getInquiry(mainPresenter, inquiry, retrofitServices);
替换 verify(mainModel).getInquiry(listener, inquiry, retrofitServices);
上的侦听器来解决这个问题,因为 this
在 mainModel.getInquiry(this, inquiry, retrofitServices);
上引用 MainPresenter.java
class 而不是 MainContract.Model.OnFinishedListener
我不知道这是否是在 android 开发中测试 MVP 架构的最佳实践,请随时纠正我。谢谢
我在构建我的应用程序时正在实施 MVP 架构,我从某个网站获得了 MVP 教程。我想测试我项目中的每一个方法。当我测试我的演示者时,发生了一个错误。它表明预期参数和实际参数不同。
我发现发生该错误是因为我在实际方法中使用了 this
关键字。我正在使用 this
因为我的演示者实现了一些接口 (OnFinishedListener
).
这是我的演示者代码和我的演示者测试。
主讲人
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
关键字时如何测试方法?
感谢您的回答。
编辑
这是差异论证的截图
我用 verify(mainModel).getInquiry(mainPresenter, inquiry, retrofitServices);
替换 verify(mainModel).getInquiry(listener, inquiry, retrofitServices);
上的侦听器来解决这个问题,因为 this
在 mainModel.getInquiry(this, inquiry, retrofitServices);
上引用 MainPresenter.java
class 而不是 MainContract.Model.OnFinishedListener
我不知道这是否是在 android 开发中测试 MVP 架构的最佳实践,请随时纠正我。谢谢