簡體   English   中英

MultiDexApplication的使用導致Application類的Robolectric測試中斷

[英]Usage of MultiDexApplication causes Robolectric test for the Application class to break

使用gradle def( https://plus.google.com/+IanLake/posts/JW9x4pcB1rj )在支持v4-r21上添加Multi dex支持

apply plugin: 'com.android.application'

android {
compileSdkVersion 19
buildToolsVersion "20.0.0"

defaultConfig {
    applicationId "info.osom.multidex"
    minSdkVersion 19
    targetSdkVersion 19
    versionCode 1
    versionName "1.0"
}
buildTypes {
    release {
        runProguard false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

dexOptions {
    preDexLibraries = false
}

afterEvaluate {
    tasks.matching {
    it.name.startsWith('dex')
    }.each { dx ->
    if (dx.additionalParameters == null) {
        dx.additionalParameters = []
    }
    dx.additionalParameters += '--multi-dex'
    dx.additionalParameters += "--main-dex-list=$projectDir/multidex.keep".toString()
}

現在這適用於應用程序本身,我能夠構建和部署,但是當我為我的Application類運行robolectric測試時,我從ZipUtils(在MultiDex.java中捕獲)中失敗了。 其他測試運行正常。 這是痕跡 -

引起:java.lang.RuntimeException:Multi dex安裝失敗(/ Users / Code / android-code / android /。(是一個目錄))。 在Android.support.multiDex.install(MultiDex.java:178)的android.support.multidex.MultiDexApplication.attachBaseContext(MultiDexApplication.java:39)android.app.Application.attach(Application.java:181)at at android.support.multidex.MultiDex.install(MultiDex.java:178)或者org.robolectric.invoke(Invoker.java:112)org.robolectric.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.java:155)org.robolectric.RobolectricTestRunner.setUpApplicationState(RobolectricTestRunner.java:430)中的org.fest.reflect.method.Invoker.invoke at org.robolectric.RobolectricTestRunner $ 2.evaluate(RobolectricTestRunner.java:236)org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)org.junit.runners.ParentRunner $ 3.run(ParentRunner.java:238)at org.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java) :63)在org.junit.runne的org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) rs.ParentRunner.access $ 000(ParentRunner.java:53)org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:229)org.robolectric.RobolectricTestRunner $ 1.evaluate(RobolectricTestRunner.java:177)at org。 junit.runners.ParentRunner.run(ParentRunner.java:309)位於org.gradle.api.internal.tasks的org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:86)。在org.gradle.api.internal.tasks的org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:69)上的testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:49)。 test.uiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:48)atg.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)在org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.jav) a:32)在org.gradle.api.internal.tasks的com.sun.proxy上的org.gradle.messaging.dispatch.ProxyDispatchAdapter $ DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)。$ Proxy2.processTestClass(未知來源) .testing.worker.TestWorker.processTestClass(TestWorker.java:105)

添加multi-dex shadow作為依賴項

testCompile "org.robolectric:shadows-multidex:3.0"

這將模擬MultiDex.install調用並且什么都不做,因為Robolectric中沒有dex

這是一個已知的錯誤,等待修復: https//github.com/robolectric/robolectric/issues/1328

您需要創建一個繼承自MultiDexApplication的Application類,attachBaseContext(Context)是Override,如果在JavaVM上運行,則會破壞異常。

  import android.content.Context;
    import android.support.multidex.MultiDexApplication;

    public class Application extends MultiDexApplication {

       @Override
       protected void attachBaseContext(Context base) {
          try {
            super.attachBaseContext(base);
          } catch (Exception e) {
            String vmName = System.getProperty("java.vm.name");
            if (!vmName.startsWith("Java")) {
               throw e;
            }
          }
       }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM