0

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.

助けてくれてありがとう!

4

2 に答える 2

0

スタック トレースによると、Android で EasyMock を使用しています。Android には Java6 の完全な実装が付属していません。特に、一部の java.beans クラスが欠落しています (例: java.beans.PropertyDescriptor)。これらのクラスは、cglib によって使用されることがあります。

ClassProxyFactory.java:249 にブレークポイントを設定すると、欠落しているクラスが見つかる可能性があります。

于 2013-10-27T18:53:22.240 に答える