Iva*_*ers 6 unit-testing maven maven-surefire-plugin kotlin
我有一个我想测试的Kotlin应用程序.我的tests(.kt)文件在Eclipse中成功执行.(测试本身是一个h2 mockjdbc测试).
现在运行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
Run Code Online (Sandbox Code Playgroud)
并且它不执行任何测试(它找不到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>
Run Code Online (Sandbox Code Playgroud)
Jay*_*ard 18
两个问题,你发现自己的第一个问题,但我会在这里记录.在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>
Run Code Online (Sandbox Code Playgroud)
这是编译src/main/java目录而不是src/test/java你的测试根本没有编译.应该:
<sourceDirs>
<sourceDir>${project.basedir}/src/test/java</sourceDir>
</sourceDirs>
Run Code Online (Sandbox Code Playgroud)
或者,如果您的文件都在java和kotlin目录中:
<sourceDirs>
<sourceDir>${project.basedir}/src/test/java</sourceDir>
<sourceDir>${project.basedir}/src/test/kotlin</sourceDir>
</sourceDirs>
Run Code Online (Sandbox Code Playgroud)
第二个问题可能是你试图解决第一个问题.它在表面上看起来很好但是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>
Run Code Online (Sandbox Code Playgroud)
不做你认为它做的事.这实际上是在Surefire中通过搜索转换并替换.java为.class,并在内部变为:
<configuration>
<includes>
<include>**/Test*.class</include>
<include>**/*Test.class</include>
<include>**/*TestCase.class</include>
<include>**/RandomName.class</include>
</includes>
</configuration>
Run Code Online (Sandbox Code Playgroud)
但是,如果你使用.kt扩展,你打破了这个硬编码的魔法.你可以看到它在Surefire插件的源代码,它取代了与结尾的文件.java用.class. 哎呀,它与源文件完全无关,正在寻找编译类.
在Surefire插件中,2.19他们添加了具有正则表达式和完全限定类名模式的功能.所以插件决定你使用的方式似乎是文件扩展名.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>
Run Code Online (Sandbox Code Playgroud)
现在比较任何包中具有这些名称的任何类.