这里有很多答案涉及AsyncTasks
的 Robolectric 测试。但是,我认为我当前的实现可能会略有不同。
我有一个片段,它在调用服务器后显示数据列表。我在这里使用AsyncTask
类来执行此后台服务。但是,就测试该功能(获取数据)的最佳方法而言,我面临着一些挑战。
问题1
AsyncTask
类的构造函数中,以便继续执行。 如何从测试班级访问这些数据? AsyncTask
类吗?如何访问传递给它的参数? 我尝试按照ShadowAsyncTaskTest
的{{3}}给出的示例进行示例,但是我仍然不确定在我的情况下如何最好地进行。
我正在使用 Robolectric 4.1 。
我非常感谢有关如何实现此目标的一些指导。谢谢。
下面是我的代码
MyDataListFragment
private void getTheList(String state) { //This value is passed on from somewhere else
try {
Map params = new HashMap();
if (StringUtils.isNotEmpty(state)) {
params.put("State", state);
}
if (SessionManager.getUserDetails() != null) {
params.put("User", SessionManager.getUserDetails().getUserId());
} else {
populateTheList("{}");
return;
}
FetchDataTask fetchDataTask = new FetchDataTask(params, new MyInterface() {
@Override
public void onPreExecute() {
((BaseActivity) getActivity()).createDialog(getString(R.string.loading),
null);
}
@Override
public void onPostExecute(String result) {
Log.d(TAG, "fetched result: " + result);
((BaseActivity) getActivity()).clearDialog();
if (result != null && result.startsWith(Constants.IO_EXCEPTION)) {
((BaseActivity) getActivity()).showAlertDialog(getActivity(),
getString(R.string.error_network));
} else {
populateTheList(result);
}
}
});
fetchDataTask.execute((Void) null);
} catch (Exception ex) {
ex.printStackTrace();
}
}
我的AsyncTask类
public class FetchDataTask extends AsyncTask<Void, Void, String> {
private final String TAG = this.getClass().getSimpleName();
private MyInterface task;
private Map params;
public FetchDataTask(Map params, MyInterface task) {
this.params = params;
this.task = task;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
task.onPreExecute();
}
@Override
protected String doInBackground(Void... voids) {
try {
// default params
params.put(Constants.PAGE, 0);
params.put(Constants.PAGE_SIZE, Constants.DEFAULT_PAGE_SIZE);
params.put(Constants.SORT, "created,desc");
String url = "/user-data/";
return CommonHelper.sendGetRequest(BuildConfig.SERVER_URL, url,
CommonHelper.getParamsFromMap(params));
} catch (IOException ioe) {
Log.e(TAG, ioe.getMessage(), ioe);
return Constants.IO_EXCEPTION;
}
}
@Override
public void onPostExecute(String result) {
super.onPostExecute(result);
task.onPostExecute(result);
}
}
我的测试班
@RunWith(RobolectricTestRunner.class)
public class DataListFragmentTest {
DataListFragment dataListFragment;
@Before
public void setUp() throws Exception{
Robolectric.getBackgroundThreadScheduler();
Robolectric.getForegroundThreadScheduler();
}
@Test
public void fragmentIsNotNull() throws Exception{
dataListFragment = DataListFragment.newInstance();
assertNotNull(deliveriesFragment);
}
@Test
public void testNormalFlow() throws Exception{
//Map params = new HashMap();
//if (StringUtils.isNotEmpty(state)) {
//params.put("State", state);
//}
//if (SessionManager.getUserDetails() != null) {
// params.put("User",
//SessionManager.getUserDetails().getUserId());
//} else {
// return;
//}
//FetchOrdersTask fetchOrdersTask = new FetchOrdersTask(params);
}
@Test
public void onPreExecute_testDialogShows()throws Exception{
}
@Test
public void doInBackground_CanFetchOrders() throws Exception{
}
@Test
public void onPostExecute_Exception_Is_Caught() throws Exception{
}
@Test
public void onPostExecute_Result_Is_Not_Null() throws Exception{
}
@Test
public void execute_Returns_AsyncTask() throws Exception{
}
}