6

PowerMock を使用して、Android アプリ (BluetoothSocket など) のテストで使用されるいくつかのクラスをモックしようとしています。

PowerMock の Google コード ページですべての依存関係を含む zip ファイルをダウンロードし、それらを Android テスト プロジェクト (ビルド パスを含む) に追加しました。

ただし、次のように PowerMock を使用しようとすると:

@RunWith(PowerMockRunner.class )
@PrepareForTest( NetworkUtil.class )
public class TestSendAck extends TestCase{

    @Test
    public void testGenerateURL() {
         PowerMock.mockStatic( NetworkUtil.class );

         EasyMock.expect( NetworkUtil.getLocalHostname() ).andReturn( "triumph" );

         PowerMock.replayAll();
         PowerMock.verifyAll();
    }
}

次のスタック トレースを取得します。

java.lang.ExceptionInInitializerError
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.powermock.api.easymock.PowerMock.doCreateMock(PowerMock.java:2212)
at org.powermock.api.easymock.PowerMock.doMock(PowerMock.java:2163)
at org.powermock.api.easymock.PowerMock.mockStatic(PowerMock.java:287)
at se.metrima.mafield.test.TestSendAck.testGenerateURL(TestSendAck.java:19)
at java.lang.reflect.Method.invokeNative(Native Method)
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)
Caused by: java.lang.VerifyError: net.sf.cglib.core.ReflectUtils
at net.sf.cglib.core.KeyFactory$Generator.generateClass(KeyFactory.java:166)
at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
at net.sf.cglib.core.KeyFactory$Generator.create(KeyFactory.java:144)
at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:116)
at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:108)
at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:104)
at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:69)
... 19 more

このエラーは、テスト プロジェクトを Android JUnit テストとして実行しているときにのみ発生します。通常の JUnit テスト パワーモックとして実行すると、Android フレームワークを必要とするすべてのテストが自然に失敗します。

どうすればこれを解決できますか? 私は単体テストに非常に慣れていないので、まだすべての概念を理解していません。

4

1 に答える 1

2

Android でのテストのクラスパス設定に、あいまいなバージョンの JUnit ライブラリが含まれている可能性があります。JUnit 3 または 4 で実行しようとしていますか? コードは 4 の注釈を使用していますが、3 の TestCase 基本クラスも拡張しており、2 つを混在させることはできません。最近では JUnit 4 を使用するのが最善です。私は Android 開発にあまり詳しくないので、Android 環境が探している JUnit のバージョンを確認してください。次に確認することは、JUnit 3 と 4 には異なるバージョンの PowerMock があるため、適切なバージョンの PowerMock を使用しているかどうかです。

于 2012-10-12T18:51:15.347 に答える