当我通过 maven 执行它们时,我的 JUnit 测试不起作用
My JUnit tests don't work when I execute them via maven
我在我的测试项目中使用 Maven,我想测试 Maven 生命周期中的 test
选项,但我的 JUnit 测试失败了。我在 src.main.java
包中有一个名为 Arithmetics
的 class,在 src.test.java
包中有一个名为 ArithmeticsTest
的 class。
当我 运行 ArithmeticsTest
自己使用 IntelliJ IDEA 时,一切正常,我已经预料 java.lang.AssertionError
,所以为什么我 [=38] 没有这样的东西=] Maven 中的测试选项?
控制台输出:
T E S T S
Results :
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
src.main.java.Arithmetics.java
public class Arithmetics
{
public static int add(int a, int b)
{
return a + b;
}
}
src.test.java.ArithmeticsTest.java
import org.junit.jupiter.api.RepeatedTest;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class ArithmeticsTest
{
@Test
public void testAdd()
{
assertEquals(4, Arithmetics.add(2, 3));
}
}
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>groupId</groupId>
<artifactId>Test</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>15</maven.compiler.source>
<maven.compiler.target>15</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
根据您的问题,我可以发现三个错误的地方,虽然它们可能无法提供完整的答案,但我希望它们会朝着正确的方向迈出一步:
src/main/java
和 src/test/java
不是你写的包。它是 maven 支持的文件夹布局,基本上,如果您在 com.myorg.somepackage.Arithmetics
中有代码
确保在实际物理文件夹级别具有以下布局:
src
main
java
com
myorg
somepackage
Arithmetics.java
test
java
com
myorg
somepackage
ArithmeticsTest.java
对于两个 java 文件,包必须是 com.myorg.somepackage
:
package com.myorg.somepackage;
public class Arithmetics {}
和
package com.myorg.somepackage;
public class ArithmeticsTest {}
我知道你在问题中使用的命名可能是错误的,但我仍然必须说明它,因为它可能会导致实际问题
- 第二个问题是,出于某种原因,您似乎将 surefire 插件配置为使用 test ng,它是 junit 的替代品。它可能会发生,因为 testng 被放置为依赖项 - 我只能推测,因为你没有真正显示完整的 surefire 插件配置并且没有提供完整的依赖项列表,但我相信你有想法 :)
这是错误的,因为您使用了 junit5 依赖项以及对应于 junit 5 的导入。
- junit 5 的依赖完全乱七八糟:
你似乎在不同的范围内有两个相同的依赖,这确实是一个错误的事情。确保您只使用 test
范围并拥有所有相关的依赖项。阅读 here 了解如何配置 surefire 插件的说明
此外,为了回答的完整性,请检查您使用的是最新版本的surefire插件,如果太旧可能无法运行 jupiter engine (6 月 5 日)
正如其他答案已经指出的一些在您的情况下可能出错的地方,我只是将解决方案添加到您的 pom xml。
surefire 插件版本是罪魁祸首。 maven (2.12.4) 的默认值不适用于 junit-5 jupiter 引擎。
所以只需在您的 pom 中添加带有版本 2.22.1
的插件,假设您的文件夹结构符合要求(请参阅其他答案),它应该会在之后工作。
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
</plugins>
</pluginManagement>
</build>
我在我的测试项目中使用 Maven,我想测试 Maven 生命周期中的 test
选项,但我的 JUnit 测试失败了。我在 src.main.java
包中有一个名为 Arithmetics
的 class,在 src.test.java
包中有一个名为 ArithmeticsTest
的 class。
当我 运行 ArithmeticsTest
自己使用 IntelliJ IDEA 时,一切正常,我已经预料 java.lang.AssertionError
,所以为什么我 [=38] 没有这样的东西=] Maven 中的测试选项?
控制台输出:
T E S T S
Results : Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
src.main.java.Arithmetics.java
public class Arithmetics
{
public static int add(int a, int b)
{
return a + b;
}
}
src.test.java.ArithmeticsTest.java
import org.junit.jupiter.api.RepeatedTest;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class ArithmeticsTest
{
@Test
public void testAdd()
{
assertEquals(4, Arithmetics.add(2, 3));
}
}
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>groupId</groupId>
<artifactId>Test</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>15</maven.compiler.source>
<maven.compiler.target>15</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
根据您的问题,我可以发现三个错误的地方,虽然它们可能无法提供完整的答案,但我希望它们会朝着正确的方向迈出一步:
src/main/java
和src/test/java
不是你写的包。它是 maven 支持的文件夹布局,基本上,如果您在com.myorg.somepackage.Arithmetics
中有代码 确保在实际物理文件夹级别具有以下布局:
src
main
java
com
myorg
somepackage
Arithmetics.java
test
java
com
myorg
somepackage
ArithmeticsTest.java
对于两个 java 文件,包必须是 com.myorg.somepackage
:
package com.myorg.somepackage;
public class Arithmetics {}
和
package com.myorg.somepackage;
public class ArithmeticsTest {}
我知道你在问题中使用的命名可能是错误的,但我仍然必须说明它,因为它可能会导致实际问题
- 第二个问题是,出于某种原因,您似乎将 surefire 插件配置为使用 test ng,它是 junit 的替代品。它可能会发生,因为 testng 被放置为依赖项 - 我只能推测,因为你没有真正显示完整的 surefire 插件配置并且没有提供完整的依赖项列表,但我相信你有想法 :)
这是错误的,因为您使用了 junit5 依赖项以及对应于 junit 5 的导入。
- junit 5 的依赖完全乱七八糟:
你似乎在不同的范围内有两个相同的依赖,这确实是一个错误的事情。确保您只使用 test
范围并拥有所有相关的依赖项。阅读 here 了解如何配置 surefire 插件的说明
此外,为了回答的完整性,请检查您使用的是最新版本的surefire插件,如果太旧可能无法运行 jupiter engine (6 月 5 日)
正如其他答案已经指出的一些在您的情况下可能出错的地方,我只是将解决方案添加到您的 pom xml。
surefire 插件版本是罪魁祸首。 maven (2.12.4) 的默认值不适用于 junit-5 jupiter 引擎。
所以只需在您的 pom 中添加带有版本 2.22.1
的插件,假设您的文件夹结构符合要求(请参阅其他答案),它应该会在之后工作。
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
</plugins>
</pluginManagement>
</build>