2017-06-21 2 views
2

Ich benutze Gradle 3.3 und versuche, ein benutzerdefiniertes Plugin mit JUnit und Gradle TestKit zu testen. In Plugin build.gradle Ich habeplugin-under-test-metadata.properties nicht erstellt von Gradle TestKit beim Ausführen von Tests in IDEA

version '0.1' 

apply plugin: 'groovy' 
apply plugin: 'java-gradle-plugin' 

sourceCompatibility = 1.8 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile project(':codegen-core') 
    compile localGroovy() 
    testCompile 'junit:junit:4.12' 
} 

Der Test ist

package com.huawei.odmf.codegen.gradle 

import org.gradle.testkit.runner.BuildResult 
import org.gradle.testkit.runner.GradleRunner 
import org.gradle.testkit.runner.TaskOutcome 
import org.junit.Before 
import org.junit.Rule 
import org.junit.Test 
import org.junit.rules.TemporaryFolder 

import static org.junit.Assert.* 

class TestOdmfCodegenPlugin { 

    @Rule 
    public final TemporaryFolder testProjectDir = new TemporaryFolder() 

    private File buildFile 
    private File assetsDir 

    @Before 
    void setUp() { 
     buildFile = testProjectDir.newFile("build.gradle") 
     assetsDir = testProjectDir.newFolder("src", "main", "assets") 
    } 

    @Test 
    void testPlugin() { 
     buildFile << """ 
      plugins { 
      id 'com.huawei.odmf' 
     } 

     apply plugin: 'com.android.application' 

     odmf { 
      modelFile 'odmf.xml' 
     } 
     """ 

     BuildResult result = GradleRunner.create(). 
       withProjectDir(testProjectDir.root). 
       withArguments(OdmfCodegenPlugin.taskName). 
       withPluginClasspath(). 
       build() 

     // assertions 
    } 
} 

Unter src/main/resources/META-INF/gradle-plugins/com.huawei.odmf.properties habe ich

implementation-class=com.huawei.odmf.codegen.gradle.OdmfCodegenPlugin 

Dies scheint alles zu sein, dass nach https://docs.gradle.org/current/userguide/test_kit.html#sub:test-kit-automatic-classpath-injection und der automaticClasspathInjectionQuickstart Probe erforderlich ist.

schlägt jedoch fehl, dieser Test bei withPluginClasspath() (EDIT: wenn in IDEA laufen, es funktioniert von der Kommandozeile) mit dem folgenden Stack-Trace (meinem Verständnis wird plugin-under-test-metadata.properties soll durch java-gradle-plugin automatisch erstellt werden):

org.gradle.testkit.runner.InvalidPluginMetadataException: Test runtime classpath does not contain plugin metadata file 'plugin-under-test-metadata.properties' 

    at org.gradle.testkit.runner.internal.PluginUnderTestMetadataReading.readImplementationClasspath(PluginUnderTestMetadataReading.java:44) 
    at org.gradle.testkit.runner.internal.PluginUnderTestMetadataReading.readImplementationClasspath(PluginUnderTestMetadataReading.java:37) 
    at org.gradle.testkit.runner.internal.DefaultGradleRunner.withPluginClasspath(DefaultGradleRunner.java:146) 
    at org.gradle.testkit.runner.internal.DefaultGradleRunner$withPluginClasspath$0.call(Unknown Source) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117) 
    at com.huawei.odmf.codegen.gradle.TestOdmfCodegenPlugin.testPlugin(TestOdmfCodegenPlugin.groovy:40) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
    at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:48) 
    at org.junit.rules.RunRules.evaluate(RunRules.java:20) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) 
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) 

Was fehlt mir?

+0

Soweit ich mich erinnere, müssen Sie 'withPluginClaspath()' nicht explizit aufrufen. Versuchen Sie es, ohne es explizit aufzurufen. Wenn es funktioniert, sag es mir, dann mache ich das eine Antwort. – Vampire

+0

@Vampire Leider tut es nicht: "Plugin [id: 'com.huawei.odmf'] wurde in keiner der folgenden Quellen gefunden" –

+0

@Vampire Es funktioniert auch nicht von der Befehlszeile, aber es stellt sich heraus dass die Version, die 'withPluginClasspath() 'aufruft, dies tut. –

Antwort

5

Nachdem das Problem der Bestimmung war nur in IDEA, habe ich https://plugins.gradle.org/plugin/com.palantir.idea-test-fix gefunden und hinzugefügt

plugins { 
    id "com.palantir.idea-test-fix" version "0.1.0" 
} 

bis Anfang build.gradle für das Plugin Teilprojekt. Es behebt das Problem.

In this post (Russian), fand ich eine andere Lösung: in Settings-> Build-> Build Tools->Gradle->Runner, wähle Gradle Test Runner statt Platform Test Runner, dann den Run/Debug-Konfiguration des Tests löschen, bevor es wieder zum Laufen.

+0

Ich hatte das gleiche Problem mit IntelliJ 2017.2. Ich konnte den com.palantir.idea-test-fix nicht zum Laufen bringen, aber der Trick, zum grandle test runner zu wechseln, hat super funktioniert! – Gary

+0

BTW, dieses Problem trat bei mir auf, als ich versuchte, das hier dokumentierte Vanilla Gradle Plugin Beispiel zu verwenden: https://docs.gradle.org/current/userguide/test_kit.html#sub:test-kit-automatic-classpath-injection – Gary

+1

Das Problem tritt immer noch bei IDEA 2017.2.5 und Gradle 4.3 auf. Das Ändern des Läufers und das Löschen der Laufkonfigurationen haben es behoben, danke! – ocroquette

Verwandte Themen