我有一个我想测试的Kotlin应用程序。我的测试(.kt
)文件在Eclipse中成功执行。 (测试本身是h2 mock
jdbc测试。
现在运行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 :(得分:13)
你发现了两个问题第一个问题,但我会在这里记录。在Kotlin-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/main/java
目录而不是src/test/java
,因此您的测试根本没有编译。应该是:
<sourceDirs>
<sourceDir>${project.basedir}/src/test/java</sourceDir>
</sourceDirs>
或者,如果您的文件都在java
和kotlin
目录中:
<sourceDirs>
<sourceDir>${project.basedir}/src/test/java</sourceDir>
<sourceDir>${project.basedir}/src/test/kotlin</sourceDir>
</sourceDirs>
第二个问题很可能是您尝试解决第一个问题。它在表面上看起来很好但是Surefire插件的配置不正确。 Maven Surefire插件的文档不太准确(或者它的工作原理并不完整)。如果您完全删除Surefire插件配置,它将起作用,因为默认设置已经执行了您想要的操作。或者,您可以将列出include
文件模式从.kt
后缀改为.class
或.java
后缀,即使对于Kotlin,Clojure,Scala, ...
<强>为什么呢?这是故事......
此配置:
<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>
不按照您的想法行事。这实际上是在Surefire中通过搜索转换并在.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
替换以.class
结尾的文件。 Ooops,它与源文件完全无关,并且正在寻找已编译的类。
在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>
现在比较任何包中具有这些名称的任何类。