2016-09-27 87 views
1

所以我有一個我想測試的Kotlin應用程序。我的測試(.kt)文件在Eclipse中成功執行。 (測試本身是一個h2 mock jdbc測試)。Kotlin - Maven未執行測試

現在運行mvn test -X當它說:

releases: [enabled => true, update => never] 
] 
[DEBUG] (s) reportFormat = brief 
[DEBUG] (s) reportsDirectory = C:\Users\Ivar\workspace\anotherworkspace\newrestservice\complete\target\surefire-reports 
[DEBUG] (f) rerunFailingTestsCount = 0 
[DEBUG] (f) reuseForks = true 
[DEBUG] (s) runOrder = filesystem 
[DEBUG] (f) shutdown = testset 
[DEBUG] (s) skip = false 
[DEBUG] (f) skipAfterFailureCount = 0 
[DEBUG] (s) skipTests = false 
[DEBUG] (s) suiteXmlFiles = [] 
[DEBUG] (s) testClassesDirectory = C:\Users\Ivar\workspace\anotherworkspace\newrestservice\complete\target\test-classes 
[DEBUG] (s) testFailureIgnore = false 
[DEBUG] (s) testNGArtifactName = org.testng:testng 
[DEBUG] (s) testSourceDirectory = C:\Users\Ivar\workspace\anotherworkspace\newrestservice\complete\src\test\java 
[DEBUG] (s) threadCountClasses = 0 
[DEBUG] (s) threadCountMethods = 0 
[DEBUG] (s) threadCountSuites = 0 
[DEBUG] (s) trimStackTrace = true 
[DEBUG] (s) useFile = true 
[DEBUG] (s) useManifestOnlyJar = true 
[DEBUG] (s) useSystemClassLoader = true 
[DEBUG] (s) useUnlimitedThreads = false 
[DEBUG] (s) workingDirectory = C:\Users\Ivar\workspace\anotherworkspace\newrestservice\complete 
[DEBUG] (s) project = MavenProject: org.springframework:gs-rest-service:0.1.0 @ C:\Users\Ivar\workspace\anotherworkspace\newrestservice\complete\pom.xml 

而且它不執行任何測試(它無法找到EM)

這裏是我的pom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>org.springframework</groupId> 
    <artifactId>gs-rest-service</artifactId> 
    <version>0.1.0</version> 
    <packaging>war</packaging> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.4.0.RELEASE</version> 
    </parent> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-jdbc</artifactId> 
     </dependency> 
     <!-- <dependency> 
      <groupId>com.jayway.jsonpath</groupId> 
      <artifactId>json-path</artifactId> 
      <scope>test</scope> 
     </dependency>--> 
     <dependency> 
      <groupId>org.jetbrains.kotlin</groupId> 
      <artifactId>kotlin-stdlib</artifactId> 
      <version>1.0.3</version> 
     </dependency> 
     <dependency> 
      <groupId>org.postgresql</groupId> 
      <artifactId>postgresql</artifactId> 
      <version>9.4.1211</version><!--$NO-MVN-MAN-VER$ --> 
     </dependency> 
     <dependency> 
      <groupId>commons-dbutils</groupId> 
      <artifactId>commons-dbutils</artifactId> 
      <version>1.6</version> 
     </dependency> 
     <dependency> 
      <groupId>com.h2database</groupId> 
      <artifactId>h2</artifactId> 
      <version>1.4.191</version> 
     </dependency> 
     <!-- https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-reflect --> 


    </dependencies> 

    <properties> 
     <java.version>1.8</java.version> 
    </properties> 


    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
      <plugin> 
       <artifactId>kotlin-maven-plugin</artifactId> 
       <groupId>org.jetbrains.kotlin</groupId> 
       <version>1.0.3</version> 
       <executions> 
        <execution> 
         <id>compile</id> 
         <goals> 
          <goal>compile</goal> 
         </goals> 
         <configuration> 
          <sourceDirs> 
           <sourceDir>${project.basedir}/src/main/java</sourceDir> 
          </sourceDirs> 
         </configuration> 
        </execution> 
        <execution> 
         <id>test-compile</id> 
         <goals> 
          <goal>test-compile</goal> 
         </goals> 
         <configuration> 
          <sourceDirs> 
           <sourceDir>${project.basedir}/src/main/java</sourceDir> 
          </sourceDirs> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.5.1</version><!--$NO-MVN-MAN-VER$ --> 
       <executions> 
        <!-- Replacing default-compile as it is treated specially by maven --> 
        <execution> 
         <id>default-compile</id> 
         <phase>none</phase> 
        </execution> 
        <!-- Replacing default-testCompile as it is treated specially by maven --> 
        <execution> 
         <id>default-testCompile</id> 
         <phase>none</phase> 
        </execution> 
        <execution> 
         <id>java-compile</id> 
         <phase>compile</phase> 
         <goals> 
          <goal>compile</goal> 
         </goals> 
        </execution> 
        <execution> 
         <id>java-test-compile</id> 
         <phase>test-compile</phase> 
         <goals> 
          <goal>testCompile</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-surefire-plugin</artifactId> 
        <version>2.19.1</version><!--$NO-MVN-MAN-VER$--> 
        <configuration> 
         <includes> 
          <include>**/Test*.kt</include> 
          <include>**/*Test.kt</include> 
          <include>**/*TestCase.kt</include> 
         </includes> 
        </configuration> 
       </plugin> 
     </plugins> 
    </build> 

    <repositories> 
     <repository> 
      <id>spring-releases</id> 
      <url>https://repo.spring.io/libs-release</url> 
     </repository> 
    </repositories> 
    <pluginRepositories> 
     <pluginRepository> 
      <id>spring-releases</id> 
      <url>https://repo.spring.io/libs-release</url> 
     </pluginRepository> 
    </pluginRepositories> 
</project> 
+0

Maven文檔通常不太清楚設置,它們的用法以及它們的含義。您遇到了Maven文檔不足的典型例子。我的答案顯示了這個問題... –

回答

4

兩個問題,第一個問題你發現自己,但我會在這裏記錄。在科特林,Maven插件你有test-compile目標爲設置:

<execution> 
     <id>test-compile</id> 
     <goals> 
      <goal>test-compile</goal> 
     </goals> 
     <configuration> 
      <sourceDirs> 
       <sourceDir>${project.basedir}/src/main/java</sourceDir> 
      </sourceDirs> 
     </configuration> 
</execution> 

這是編譯的,而不是src/test/javasrc/main/java目錄,以便您的測試並不是在所有的編譯。應該是:

  <sourceDirs> 
       <sourceDir>${project.basedir}/src/test/java</sourceDir> 
      </sourceDirs> 

或者,如果你的文件都在javakotlin目錄:

  <sourceDirs> 
       <sourceDir>${project.basedir}/src/test/java</sourceDir> 
       <sourceDir>${project.basedir}/src/test/kotlin</sourceDir> 
      </sourceDirs> 

第二個問題可能你試圖解決的第一個。它看起來很好,但是Surefire插件的配置不正確。 Maven Surefire插件的文檔不太準確(或者它不完整)。如果你完全刪除了Surefire插件配置,它將會工作,因爲默認設置已經做到了你想要的。或者你也可以從具有.kt後綴改爲.class.java後綴以及那些將罰款甚至科特林,Clojure中,斯卡拉,列出include文件模式的改變...

爲什麼?這裏是故事...

此配置:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <version>2.19.1</version> 
      <configuration> 
       <includes> 
        <include>**/Test*.java</include> 
        <include>**/*Test.java</include> 
        <include>**/*TestCase.java</include> 
        <include>**/RandomName.java</include> 
       </includes> 
      </configuration> 
     </plugin> 

沒有做什麼,你認爲它。這實際上是在神火做一個搜索和替換.java.class轉化,並在內部變爲:

  <configuration> 
       <includes> 
        <include>**/Test*.class</include> 
        <include>**/*Test.class</include> 
        <include>**/*TestCase.class</include> 
        <include>**/RandomName.class</include> 
       </includes> 
      </configuration> 

但是如果你使用.kt擴展你打破這個硬編碼的魔力。您可以在source code of Surefire plugin中看到它,它將替換以.java結尾的文件和.classOoops,它根本與源文件無關,並且正在尋找編譯類。

在Surefire插件2.19他們增加了能力regex and also fully qualified classname patterns。所以插件決定你使用的方式似乎是由文件擴展名.java。如果它看到.java它知道每個.java文件都變成了一個具有相同名稱的類,所以它會查找與模式匹配的類,而不是源代碼。源代碼已經由編譯器插件編譯,而不是測試運行器。它沒有業務尋找源代碼。

所以這個設置是誤導性的,真的是用「魔術」來找出一個類名,而不是隻是要求輸入類名。當然,樣本和一切完全讓你相信它與源文件有關。事實並非如此。

最好不要使用配置,並遵循默認的命名約定。或者,如果你必須指定的東西,用更現代的正則表達式或類名稱版本的include配置:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <version>2.19.1</version> 
      <configuration> 
       <includes> 
        <include>Test*</include> 
        <include>*Test</include> 
        <include>*TestCase</include> 
        <include>RandomName</include> 
       </includes> 
      </configuration> 
     </plugin> 

這是現在比較任一類別與任何包的名稱。

+0

原來這不是問題,問題是測試沒有編譯(maven插件編譯器'sourceDir')。你的(非常詳細和解釋性的)答案幫助我解決了這個問題,所以我會接受它! – Ivaro18

+0

@ Ivaro18如果編譯包含'* .kt'實際上工作嗎?我認爲這仍然是失敗的? –

+0

不確定,我在添加sourceDir之前將其更改爲類名版本 – Ivaro18