2016-07-14 78 views
0

我在Android上使用(https://github.com/johncarl81/parcelerJacoco未能在Parceler類 - Android電子

的Parceler庫,我也使用Jacoco代碼覆蓋。

加入Parceler運行我的測試代碼覆蓋率與Jacoco現在經過然而失敗,出現以下錯誤:

Caused by: java.io.FileNotFoundException: /Users/me/android/myapp/blah/app/build/intermediates/classes/demo/com/me/blah/appname/model/User$Parcelable$Creator$0.class (No such file or directory)

User類如下:

@Parcel 
public class User { 

    @SerializedName("firstName") 
    String firstName; 

    @SerializedName("lastName") 
    String lastName; 

    @SerializedName("profileImage") 
    ProfileImage profileImage; 

    @SerializedName("username") 
    String username; 

    // empty constructor needed by the Parceler library 
    public User() { 
    } 

} 

而且我Jacoco文件是這樣的:

apply plugin: 'jacoco' 

android { 
    testOptions { 
     unitTests.all { 
      jacoco { 
       includeNoLocationClasses = true 
      } 
     } 
    } 
} 

project.afterEvaluate { 

    android.applicationVariants.all { variant -> 
     def name = variant.name 
     def testTaskName = "test${name.capitalize()}UnitTest" 

     tasks.create(name: "${testTaskName}Coverage", type: JacocoReport, dependsOn: "$testTaskName") { 
      group = "Reporting" 
      description = "Generate Jacoco coverage reports for the ${name.capitalize()} build." 

      classDirectories = fileTree(
        dir: "${project.buildDir}/intermediates/classes/${name}", 
        excludes: ['**/R.class', 
           '**/R$*.class', 
           '**/*$ViewInjector*.*', 
           '**/*$ViewBinder*.*', 
           '**/BuildConfig.*', 
           '**/Manifest*.*', 
           '**/*$ViewBinder*.*', 
           '**/*$ViewInjector*.*', 
           '**/Lambda$*.class', 
           '**/Lambda.class', 
           '**/*Lambda.class', 
           '**/*Lambda*.class', 
           '**/*InjectAdapter*.*', 
           '**/*StaticInjection*.*', 
           '**/*ModuleAdapter*.*'] 
      ) 

      sourceDirectories = files(['src/main/java'].plus(android.sourceSets[name].java.srcDirs)) 
      executionData = files("${project.buildDir}/jacoco/${testTaskName}.exec") 

      reports { 
       xml.enabled = true 
       html.enabled = true 
      } 
     } 
    } 
} 

我想知道是否需要將生成的Parceler文件添加到排除我的Jacoco文件中的列表?如果是這樣,我該怎麼做?我嘗試了各種變化,但似乎沒有工作。

錯誤抱怨下列文件丟失:

User$Parcelable$Creator$0.class

其所,而是如下生成文件:

User$$Parcelable.class

任何人都可以解釋一下嗎?

+0

你能確認你的創造者類的名稱?它似乎缺少一些'$'。不應該命名爲'User $$ Parcelable $ Creator $$ 0.class'? –

+0

在生成文件的生成輸出中?它肯定是用戶$$ Parcelable.class –

+0

「Creator」內部類如何?它是什麼名字?是否被proguard偶然刪除? –

回答

1

我只是排除在jacocoAndroidCoverage.gradle,像這樣和現在的工作

def coverageSourceDirs = [ 
     '../app/src/main/java' 
] 

task jacocoStagingDebugCoverageReport(type:JacocoReport, dependsOn: ["connectedStagingDebugAndroidTest"]) { 
    group = "Reporting" 

    description = "Generate Jacoco coverage reports for staging debug" 
    classDirectories = fileTree(
      dir: '../app/build/intermediates/classes/staging/debug/com/', 
      excludes: ['**/R.class', 
         '**/R$*.class', 
         '**/*$ViewInjector*.*', 
         '**/*$ViewBinder*.*', 
         '**/*MembersInjector*.*', 
         '**/BuildConfig.*', 
         '**/Manifest*.*', 
         '**/*$Lambda$*.class', 
         '**/*Factory*.class', 
         '**/*$Builder*', 
         '**/*$Parcelable*.*', 
         '**/*DaggerApplicationComponent*.class', 
         '**/api'] 
    ) 

    additionalSourceDirs = files(coverageSourceDirs) 
    sourceDirectories = files(coverageSourceDirs) 
    executionData = files('build/outputs/code-coverage/connected/flavors/staging/coverage.ec') 

    reports { 
     xml.enabled = true 
     html.enabled = true 
    } 
}