gpt4 book ai didi

android - 使用 Retrofit 测试 MVP Android

转载 作者:太空狗 更新时间:2023-10-29 14:56:11 27 4
gpt4 key购买 nike

我正在开发基于 MVP 模式的应用程序,使用改造来执行网络。我想对演示者进行单元测试,但失败了。

在我的应用程序中,dataView 实现了 DataView这是被 Mockito mock 的。在 DataPresenteronViewCreated方法 MyApi实例来自MyApplication它执行请求。匿名Subscriber<Data> onNext 调用 showData(Data data)dataView .不幸的是Mockito.verify(dataView).showData(data)未通过测试。我自己 mock 改造客户端以确定性的方式响应。

代码如下:

public class DataFragment extends ProgressFragment implements DataView {

protected DataPresenter mDataPresenter;

//[...] initialization arguments boilerplate etc.


@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mDataPresenter.onViewCreated(mId);
//[...]
}

@Override
public void startLoading() {
setContentShown(false);
}

@Override
public void stopLoading() {
setContentShown(true);
}

@Override
public void showData(Data data) {
setContentEmpty(false);
//[...] present data
}

@Override
public void showError() {
setContentEmpty(true);
setEmptyText(R.string.unknown_error);
}
}

DataPresenter :

@Override
public void onViewCreated(long id) {
getView().startLoading();
MyApplication.getInstance().getMyApi().checkIn(User.getUser().getFormattedTokenForRequest(),
(int) id).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io()).subscribe(new Subscriber<Data>() {
@Override
public void onCompleted() {

}

@Override
public void onError(Throwable e) {
getView().showError();
getView().stopLoading();
}

@Override
public void onNext(Data data) {
getView().showData(data);
getView().stopLoading();

}
});
;
}

我的测试用例:

    public static final String GOOD_RESPONSE = "[Data in JSON]"
public static final int GOOD_STATUS = 201;

@Mock
DataView mDataView;

@Mock
MyApplication app;

@Mock
SharedPreferencesManager mSharedPreferencesManager;

DataPresenter mDataPresenter;

@Before
public void setUp() throws Exception {
mDataPresenter = new DataPresenterImpl(mDataView);
MyApplication.setInstance(app);
Mockito.when(app.getSharedPreferencesManager()).thenReturn(mSharedPreferencesManager);
Mockito.when(mSharedPreferencesManager.getUser()).thenReturn(null);
}

@Test
public void testCase() throws Exception {
RestAdapter adapter = (new RestAdapter.Builder()).setEndpoint(URL)
.setClient(new MockClient(GOOD_RESPONSE, GOOD_STATUS))
.build();
Mockito.when(app.getMyApi()).thenReturn(adapter.create(MyApi.class));
mCheckInPresenter.onViewCreated(3);
Mockito.verify(checkInView).startLoading();
Mockito.verify(checkInView).showData(new Data());
}

测试失败“需要但未调用:dataView.showData(...".

有趣的是Response execute()MockClient 中调用但是onNext(Data data)在订户中包含在 DataPresenterImpl 中不是。有任何想法吗?我猜这是异步请求的问题。

最佳答案

问题是工作被发送到不同的线程,mockito 无法验证发生了什么。我的解决方案是创建一个调度程序工厂并模拟它并返回主线程进行测试像这些。像这样的东西:

public class schedulerFactory {

public Scheduler io() {
return Schedulers.io();
}
//etc
}

然后在你的测试中你会写这样的东西:

@Mock SchedulerFactory factory

@Before
public void setUp() {
when(factory.io()).thenReturn(Schedulers.mainThread());

}

一般来说,在同一个线程中运行所有代码进行测试是个好主意

关于android - 使用 Retrofit 测试 MVP Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31208930/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com