私が作成したいくつかの単体テストを改善しようとしているので、mockito を使用していくつかのオブジェクトをモックしています。今のところ、2 つの質問があります。AsyncTask をモックする必要がありますか?(もしそうなら)このモックされたオブジェクトを使用して、モックされたオブジェクトのdoInBackground()
メソッドを呼び出すにはどうすればよいですか?
私はいくつかのことを試しましたが、まだ機能していません。私のテストではまだアサーションの失敗が返されます:
AsyncTask の実行方法 (StudioActivity.java 内):
.....
LocationTask task = new LocationTask();
task.execute((LocationManager) this.getSystemService(Context.LOCATION_SERVICE));
私の非同期タスク (StudioActivity.java 内):
.....
public class LocationTask extends AsyncTask<LocationManager, Void, String> {
private LocationManager mLocationManager;
// private TextView mLocText;
@Override
protected void onPreExecute() {
super.onPreExecute();
// mLocText = (TextView) findViewById(R.id.textView_location);
// mLocText.setVisibility(View.VISIBLE);
}
@Override
public String doInBackground(LocationManager... params) {
mLocationManager = params[0];
Location loc = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
Geocoder gcd = new Geocoder(getApplicationContext(), Locale.getDefault());
List<Address> addresses;
try {
addresses = gcd.getFromLocation(loc.getLatitude(), loc.getLongitude(), 1);
if (addresses.size() > 0) {
return (addresses.get(0).getLocality() + ", " + addresses.get(0).getCountryName());
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
mPreviewFragment.setLocation(result);
mLocation = result;
}
}
これは私が試したものです。
私のテスト方法 (TestStudioActivity.java 内):
@UiThreadTest
public void testGeolocalistationLabel() throws InterruptedException, ExecutionException{
LocationTask mockLocationTask = mock(StudioActivity.LocationTask.class);
when(mockLocationTask.doInBackground((LocationManager[]) any())).thenReturn("JUnit, Location");
mStudioBoastPreviewFragment.getGeoloc().performClick();
assertEquals("JUnit, Location",mStudioBoastPreviewFragment.getGeolocTextView().getText());
verify(mockLocationTask).doInBackground((LocationManager[]) any());
}
また
@UiThreadTest
public void testGeolocalistationLabel() throws InterruptedException, ExecutionException{
LocationTask mockLocationTask = mock(StudioActivity.LocationTask.class);
when(mockLocationTask.doInBackground((LocationManager) mStudioActivity.getSystemService(Context.LOCATION_SERVICE))).thenReturn("JUnit, Location");
mStudioBoastPreviewFragment.getGeoloc().performClick();
assertEquals("JUnit, Location",mStudioBoastPreviewFragment.getGeolocTextView().getText());
verify(mockLocationTask).doInBackground((LocationManager) mStudioActivity.getSystemService(Context.LOCATION_SERVICE));
}
失敗:
junit.framework.AssertionFailedError: expected:<JUnit, Location> but was:<>
at com.c4mprod.bhost.test.TestStudioActivity.testGeolocalistationLabel(TestStudioActivity.java:255)
モッキングなしで、それは機能しています。しかし、テストの実行には時間がかかります。そのため、テスト速度を向上させ、接続の問題やサーバー エラーを回避するために、Mockito を使用したいと考えました。場所がに表示されるかどうかをテストしたいだけですmStudioBoastPreviewFragment.getGeolocTextView()
。
どちらの場合もアサーションの失敗があるので、どの方法が最適で、それをどのように使用して this をモックできるかを知りたいと思いましたdoInBackground()
。または、AsyncTask をモックする別の方法がある場合。
助けてくれてありがとう!