2017-06-21 34 views
2

我正在使用Gradle 3.3並嘗試使用JUnit和Gradle TestKit測試自定義插件。在插件的build.gradleplugin-under-test-metadata.properties當在IDEA中運行測試時不由Gradle TestKit創建

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' 
} 

測試是

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 
    } 
} 

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

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

這似乎是所有這一切根據https://docs.gradle.org/current/userguide/test_kit.html#sub:test-kit-automatic-classpath-injectionautomaticClasspathInjectionQuickstart樣品所需。

然而,這個測試失敗在withPluginClasspath()(編輯:在IDEA中運行時,它的命令行工作)與以下堆棧跟蹤(我的理解,plugin-under-test-metadata.properties是應該建立由java-gradle-plugin自動):

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) 

我錯過了什麼?

+0

據我記得你不需要明確地調用'withPluginClasspath()'。儘量不要明確地調用它。如果它有效,告訴我,然後我做出答案。 – Vampire

+0

@吸血鬼不幸的是,它沒有:「插件[id:'com.huawei.odmf']在以下任何源中都找不到」 –

+0

@吸血鬼它也不能從命令行工作,但事實證明,那個調用'withPluginClasspath()'的版本呢。 –

回答

5

確定問題後在IDEA只是,我發現https://plugins.gradle.org/plugin/com.palantir.idea-test-fix並添加

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

build.gradle該插件子項目開始。它解決了這個問題。

this post (Russian),我找到了另一種解決方案:在Settings-> Build-> Build Tools->Gradle->Runner,選擇Gradle Test Runner代替Platform Test Runner,然後再運行它之前刪除測試的運行/調試配置。

+0

我有與IntelliJ 2017.2相同的問題。我無法獲得com.palantir.idea-test-fix的工作,但轉換到gradle test runner的技巧非常棒! – Gary

+0

順便說一句,在嘗試使用這裏記錄的vanilla gradle插件示例時,我遇到了這個問題:https://docs.gradle.org/current/userguide/test_kit.html#sub:test-kit-automatic-classpath-injection – Gary

+1

IDEA 2017.2.5和Gradle 4.3仍然存在問題。更改跑步者並刪除跑步配置修復了它,謝謝! – ocroquette

相關問題