[JAVA] Vermitteln Sie mit Gradle den Streit zwischen Power Mock und Jacoco

Überblick

Ziel ist eine 100% ige Java UT-Abdeckung mit einem bestimmten PJ Als ich einen Bericht mit jacoco erstellt habe, test_coverage.png Es wird auf der ganzen Linie 0% sein.

Anscheinend mag Jacoco Powermock nicht, einen rauen Mann ... Das heißt, Powermock-Sucht ist ein Tod.

Problemumgehung

https://github.com/powermock/powermock/wiki/Code-coverage-with-JaCoCo

Second way to get code coverage with JaCoCo - use offline Instrumentation.

Anscheinend Offline-Instrumentierung. Es gibt nur ein Implementierungsbeispiel in Maven und es gibt nicht viele Artikel darüber, wie man in Gradle schreibt. Schreiben wir es also.

Abhängigkeiten

build.gradle


dependencies {
  testCompile group: 'org.mockito', name: 'mockito-core', version: '2.2.7'
  testCompile group: 'org.powermock', name: 'powermock-api-mockito2', version: '2.0.0-beta.5'
  testCompile group: 'org.powermock', name: 'powermock-module-junit4', version: '2.0.0-beta.5'

  jacoco group: 'org.jacoco', name: 'org.jacoco.ant', version: '0.8.2', classifier: 'nodeps'
  jacocoRuntime group: 'org.jacoco', name: 'org.jacoco.agent', version: '0.8.2', classifier: 'runtime'
}

Bitte beachten Sie übrigens, dass die Offline-Instrumentierung nach 1.6.6 Powermock zu funktionieren scheint.

Offline Instrumentation

build.gradle


configurations {
  jacoco
  jacocoRuntime
}

task instrument(dependsOn: ['classes']) {
  ext.outputDir = buildDir.path + '/classes-instrumented'
  doLast {
    ant.taskdef(name: 'instrument',
                classname: 'org.jacoco.ant.InstrumentTask',
                classpath: configurations.jacoco.asPath)
    ant.instrument(destdir: outputDir) {
      fileset(dir: sourceSets.main.output.classesDir)
    }
  }
}

gradle.taskGraph.whenReady { graph ->
  if (graph.hasTask(instrument)) {
    tasks.withType(Test) {
      doFirst {
        systemProperty 'jacoco-agent.destfile', buildDir.path + '/jacoco/jacoco-coverage.exec'
        classpath = files(instrument.outputDir) + classpath + configurations.jacocoRuntime
      }
    }
  }
}

task report(dependsOn: ['instrument', 'test']) {
  doLast {
    ant.taskdef(name: 'report',
                classname: 'org.jacoco.ant.ReportTask',
                classpath: configurations.jacoco.asPath)
    ant.report() {
      executiondata {
        ant.file(file: buildDir.path + '/jacoco/jacoco-coverage.exec')
      }
      structure(name: 'Example') {
         classfiles {
           fileset(dir: sourceSets.main.output.classesDir)
         }
         sourcefiles {
           fileset(dir: 'src/main/java')
         }
      }
      html(destdir: buildDir.path + '/reports/jacoco/test/html')
    }
  }
}

Unmittelbar nach dem Kompilieren wird es instrumentiert und es fühlt sich an wie Test + Jacoco. Wenn ich nun versuche, die Aufgabe "Bericht" auszuführen,

coverage_after.png

PowerMock und Jacoco wurden erfolgreich abgeglichen.

Impressionen

Ich verstehe nicht wirklich, was das Instrument noch tut. Eigentlich handelt es sich um eine Multiprojektkonfiguration, daher möchte ich Berichterstattungsberichte kombinieren.

Beim nächsten Mal werde ich versuchen, verschiedene Dokumente in einem Multiprojekt zu kombinieren.

Recommended Posts

Vermitteln Sie mit Gradle den Streit zwischen Power Mock und Jacoco
Verspotten Sie den Konstruktor mit PowerMock
[Java] Überprüfen Sie den Unterschied zwischen orElse und orElseGet mit IntStream
Der Unterschied zwischen der Programmierung mit Ruby-Klassen und der Programmierung ohne Ruby-Klassen
Organisieren Sie die Beziehung zwischen SLF4J, Logback und Log4J zusammen mit ihrem Verhalten
Über den Unterschied zwischen irb und pry
Laden Sie JDK mit Gradle herunter und erstellen Sie JRE
[Java] Verstehe den Unterschied zwischen List und Set
[iOS] Verstehe den Unterschied zwischen Frame und Grenzen
[Rails / Active Record] Über den Unterschied zwischen create und create!
Erstellen und testen Sie Java + Gradle-Anwendungen mit Wercker
Verstehe den Unterschied zwischen abstrakten Klassen und Schnittstellen!
Was ist der Unterschied zwischen SimpleDateFormat und DateTimeFormatter? ??
Fassen Sie die Unterschiede zwischen C # - und Java-Schrift zusammen
Lernen Sie den rudimentären Mechanismus und die Verwendung von Gradle 4.4 kennen
Unterscheiden Sie mit regulären Ausdrücken zwischen ganzen Zahlen und Brüchen
[Swift] Über die Unfähigkeit, mit NS Predicate zwischen voller und halber Breite zu unterscheiden