Android アプリの一連の単体テストを実現しました。問題は、テストをサーバーエラーや他の記録の期待から独立させたいということです。Mocking Object が解決策のようです。
Vogella のチュートリアルに従って EasyMock を使い始めました: http://www.vogella.com/articles/EasyMock/article.html
問題は、エラーが発生し、Web で回答を探していたのですが、役立つものが見つかりませんでした... EasyMock エラーに関する質問はそれほど多くありませんが、次のような投稿を見つけました。私のものですが、十分ではありません。asmバージョンが原因で発生する可能性のあるエラーについて話している別の投稿も見つけました...
とにかく、問題は cglib にあるようです。EasyMock の Web サイトで説明を検索しました。Objenesis(1.2) と Cglib(2.2) が必要です。.jar を追加し、Vogella のアドバイスに従いました。しかし、それはまだ機能していません...
また、 AsyncTask をモックすることが良いことなのか、それとも AsyncTask によって呼び出される他のメソッドをモックする必要があるのか も知りたいですonPostExecute()
。
エラーログ:
java.lang.VerifyError: net.sf.cglib.proxy.Enhancer
at org.easymock.internal.ClassProxyFactory.createEnhancer(ClassProxyFactory.java:249)
at org.easymock.internal.ClassProxyFactory.createProxy(ClassProxyFactory.java:159)
at org.easymock.internal.MocksControl.createMock(MocksControl.java:59)
at org.easymock.EasyMock.createNiceMock(EasyMock.java:139)
at com.c4mprod.bhost.test.TestStudioActivity.setUp(TestStudioActivity.java:65)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:529)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1448)
私のsetUp()テストコード:
@Override
public void setUp() throws Exception{
super.setUp();
setActivityInitialTouchMode(true);
Intent testIntent = new Intent();
testIntent.setAction(StudioActivity.ACTION_BHOST);
testIntent.putExtra(StudioActivity.EXTRA_USER_ID,525);//DEVICE'S USER
setActivityIntent(testIntent);
//asyncGeoloc is an instance of LocationTask an AsyncTask
//The error comes from this line below...
asyncGeoloc = createNiceMock(StudioActivity.LocationTask.class);
mStudioActivity = getActivity();
mWFBoasterPreviewFragment = new WeakReference<BoasterPreviewFragment>((BoasterPreviewFragment) mStudioActivity.getSupportFragmentManager().findFragmentById(R.id.fragment_preview));
mWFStudioBoastPreviewFragment = new WeakReference<StudioBoastPreviewFragment>((StudioBoastPreviewFragment) mStudioActivity.getSupportFragmentManager().findFragmentById(R.id.fragment_layout));
mWFRecordFragment = new WeakReference<RecordFragment>((RecordFragment) mStudioActivity.getSupportFragmentManager().findFragmentByTag(RecordFragment.TAG_FRAGMENT_NAME));
mBoasterPreviewFragment = mWFBoasterPreviewFragment.get();
mStudioBoastPreviewFragment = mWFStudioBoastPreviewFragment.get();
mRecordFragment = mWFRecordFragment.get();
}
私の位置情報テストコード:
public void testGeolocalistationLabel(){
ActivityMonitor activityMonitor = getInstrumentation().addMonitor(StudioActivity.class.getName(), null, false);
//My doInBackground() takes a LocationManager in param
LocationManager lLocation = (LocationManager) mStudioActivity.getSystemService(getInstrumentation().getTargetContext().LOCATION_SERVICE);
expect(asyncGeoloc.doInBackground(lLocation)).andReturn("JUnit, Location");
replay(asyncGeoloc);
mStudioActivity.runOnUiThread(new Runnable() {
@Override
public void run(){
mStudioBoastPreviewFragment.getGeoloc().performClick();
}
});
StudioActivity lStudioActivity = (StudioActivity) getInstrumentation().waitForMonitorWithTimeout(activityMonitor,5000);
assertEquals("JUnit, Location",mStudioBoastPreviewFragment.getGeolocTextView().getText());
}
まあ、誰かがそれについてもっと情報を持っているか、それが良いかどうかについて私に答えることができるなら Mock AsyncTask
.
助けてくれてありがとう!