ChatGPT解决这个技术问题 Extra ChatGPT

Maven 找不到要运行的 JUnit 测试

我有一个 Maven 程序,它编译得很好。当我运行 mvn test 时,它不会运行任何测试(在 TESTs 标题下显示 There are no tests to run.)。

我用一个超级简单的设置重新创建了这个问题,我将在下面包括使用 -X 运行时的输出。

单元测试在 Eclipse 中运行良好(无论是使用其默认的 junit 包,还是当我包含由 maven 下载的 junit.jar 时)。 mvn test-compile 也正确创建了测试类下的类。我在带有 Maven 3.0.2 和 java 1.6.0_24 的 OSX 10.6.7 上运行它。

这是目录结构:

/my_program/pom.xml
/my_program/src/main/java/ClassUnderTest.java
/my_program/src/test/java/ClassUnderTestTests.java

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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>my_group</groupId>
    <artifactId>my_program</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>My Program</name>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.5</source>
                    <target>1.5</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

类UnderTest.java:

public class ClassUnderTest {

    public int functionUnderTest(int n) {
        return n;
    }

}

类UnderTestTests.java:

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class ClassUnderTestTests {

    private ClassUnderTest o;

    @Before
    public void setUp() {
        o = new ClassUnderTest();
    }

    @Test
    public void testFunctionUnderTest_testCase1() {
        Assert.assertEquals(1, o.functionUnderTest(1));
    }

    @Test
    public void testFunctionUnderTest_testCase2() {
        Assert.assertEquals(2, o.functionUnderTest(2));
    }
}

mvn -X 测试结束:

[DEBUG] Configuring mojo org.apache.maven.plugins:maven-surefire-plugin:2.7.1:test from plugin realm ClassRealm[plugin>org.apache.maven.plugins:maven-surefire-plugin:2.7.1, parent: sun.misc.Launcher$AppClassLoader@5224ee]
[DEBUG] Configuring mojo 'org.apache.maven.plugins:maven-surefire-plugin:2.7.1:test' with basic configurator -->
[DEBUG]   (s) basedir = /Users/aaron/Programs/my_program
[DEBUG]   (s) childDelegation = false
[DEBUG]   (s) classesDirectory = /Users/aaron/Programs/my_program/target/classes
[DEBUG]   (s) disableXmlReport = false
[DEBUG]   (s) enableAssertions = true
[DEBUG]   (s) forkMode = once
[DEBUG]   (s) junitArtifactName = junit:junit
[DEBUG]   (s) localRepository =        id: local
      url: file:///Users/aaron/.m2/repository/
   layout: none

[DEBUG]   (f) parallelMavenExecution = false
[DEBUG]   (s) pluginArtifactMap = {org.apache.maven.plugins:maven-surefire-plugin=org.apache.maven.plugins:maven-surefire-plugin:maven-plugin:2.7.1:, org.apache.maven.surefire:surefire-booter=org.apache.maven.surefire:surefire-booter:jar:2.7.1:compile, org.apache.maven.surefire:surefire-api=org.apache.maven.surefire:surefire-api:jar:2.7.1:compile, org.apache.maven.surefire:maven-surefire-common=org.apache.maven.surefire:maven-surefire-common:jar:2.7.1:compile, org.apache.maven.shared:maven-common-artifact-filters=org.apache.maven.shared:maven-common-artifact-filters:jar:1.3:compile, org.codehaus.plexus:plexus-utils=org.codehaus.plexus:plexus-utils:jar:2.0.5:compile, junit:junit=junit:junit:jar:3.8.1:compile, org.apache.maven.reporting:maven-reporting-api=org.apache.maven.reporting:maven-reporting-api:jar:2.0.9:compile}
[DEBUG]   (s) printSummary = true
[DEBUG]   (s) project = MavenProject: my_group:my_program:1.0-SNAPSHOT @ /Users/aaron/Programs/my_program/pom.xml
[DEBUG]   (s) projectArtifactMap = {junit:junit=junit:junit:jar:4.8.1:test}
[DEBUG]   (s) redirectTestOutputToFile = false
[DEBUG]   (s) remoteRepositories = [       id: central
      url: http://repo1.maven.org/maven2
   layout: default
snapshots: [enabled => false, update => daily]
 releases: [enabled => true, update => never]
]
[DEBUG]   (s) reportFormat = brief
[DEBUG]   (s) reportsDirectory = /Users/aaron/Programs/my_program/target/surefire-reports
[DEBUG]   (s) session = org.apache.maven.execution.MavenSession@dfbb43
[DEBUG]   (s) skip = false
[DEBUG]   (s) skipTests = false
[DEBUG]   (s) testClassesDirectory = /Users/aaron/Programs/my_program/target/test-classes
[DEBUG]   (s) testFailureIgnore = false
[DEBUG]   (s) testNGArtifactName = org.testng:testng
[DEBUG]   (s) testSourceDirectory = /Users/aaron/Programs/my_program/src/test/java
[DEBUG]   (s) trimStackTrace = true
[DEBUG]   (s) useFile = true
[DEBUG]   (s) useManifestOnlyJar = true
[DEBUG]   (s) workingDirectory = /Users/aaron/Programs/my_program
[DEBUG] -- end configuration --
[INFO] Surefire report directory: /Users/aaron/Programs/my_program/target/surefire-reports
[DEBUG] Setting system property [user.dir]=[/Users/aaron/Programs/my_program]
[DEBUG] Setting system property [localRepository]=[/Users/aaron/.m2/repository]
[DEBUG] Setting system property [basedir]=[/Users/aaron/Programs/my_program]
[DEBUG] Using JVM: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java
[DEBUG] Using manager EnhancedLocalRepositoryManager with priority 10 for /Users/aaron/.m2/repository
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG]   org.apache.maven.surefire:surefire-booter:jar:2.7.1:compile (selected for compile)
[DEBUG]     org.apache.maven.surefire:surefire-api:jar:2.7.1:compile (selected for compile)
[DEBUG] Adding to surefire booter test classpath: /Users/aaron/.m2/repository/org/apache/maven/surefire/surefire-booter/2.7.1/surefire-booter-2.7.1.jar Scope: compile
[DEBUG] Adding to surefire booter test classpath: /Users/aaron/.m2/repository/org/apache/maven/surefire/surefire-api/2.7.1/surefire-api-2.7.1.jar Scope: compile
[DEBUG] Using manager EnhancedLocalRepositoryManager with priority 10 for /Users/aaron/.m2/repository
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG]   org.apache.maven.surefire:surefire-junit4:jar:2.7.1:test (selected for test)
[DEBUG]     org.apache.maven.surefire:surefire-api:jar:2.7.1:test (selected for test)
[DEBUG] Adding to surefire test classpath: /Users/aaron/.m2/repository/org/apache/maven/surefire/surefire-junit4/2.7.1/surefire-junit4-2.7.1.jar Scope: test
[DEBUG] Adding to surefire test classpath: /Users/aaron/.m2/repository/org/apache/maven/surefire/surefire-api/2.7.1/surefire-api-2.7.1.jar Scope: test
[DEBUG] Test Classpath :
[DEBUG]   /Users/aaron/Programs/my_program/target/test-classes
[DEBUG]   /Users/aaron/Programs/my_program/target/classes
[DEBUG]   /Users/aaron/.m2/repository/junit/junit/4.8.1/junit-4.8.1.jar
[DEBUG] Using manager EnhancedLocalRepositoryManager with priority 10 for /Users/aaron/.m2/repository
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG]   org.apache.maven.surefire:surefire-booter:jar:2.7.1:compile (selected for compile)
[DEBUG]     org.apache.maven.surefire:surefire-api:jar:2.7.1:compile (selected for compile)
[DEBUG] Adding to surefire booter test classpath: /Users/aaron/.m2/repository/org/apache/maven/surefire/surefire-booter/2.7.1/surefire-booter-2.7.1.jar Scope: compile
[DEBUG] Adding to surefire booter test classpath: /Users/aaron/.m2/repository/org/apache/maven/surefire/surefire-api/2.7.1/surefire-api-2.7.1.jar Scope: compile
Forking command line: /bin/sh -c cd /Users/aaron/Programs/my_program && /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java -jar /Users/aaron/Programs/my_program/target/surefire/surefirebooter6118081963679415631.jar /Users/aaron/Programs/my_program/target/surefire/surefire4887918564882595612tmp /Users/aaron/Programs/my_program/target/surefire/surefire9012255138269731406tmp

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
There are no tests to run.

Results :

Tests run: 0, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.089s
[INFO] Finished at: Mon May 30 12:03:09 EDT 2011
[INFO] Final Memory: 7M/62M
[INFO] ------------------------------------------------------------------------
对于使用 spring-boot 的人,请检查 stackoverflow.com/a/60831916/990279
对我来说,IntelliJ 试图通过为我做事来“帮助我”并打破了测试。如果我对 Junit Jupiter 有正确的依赖关系,并且对 SureFire 插件有正确的插件版本,并且我在类名上使用 ALT+ENTER 来创建测试,maven 将无法识别测试类并且不会运行它。但是,当我根据 Maven 命名约定手动创建测试文件时,它将被 Maven 识别并运行。我还没有弄清楚如何扭转 IntelliJ 破坏测试的过程
当我重构我的项目以将 main 与测试分开时,我不小心忘记了创建“src/test/java”文件夹,因此我的包从 src/test 开始。这导致 mvn compile 目标错过了测试类,因此在运行测试时,没有编译的测试类。由于 Eclipse 使用内部测试运行程序,JUnit 测试可能在 Eclipse 中工作得很好,但在 Maven 的命令行中可能会失败。

I
Ilya Serbis

默认情况下,Maven uses the following naming conventions 在寻找要运行的测试时:

测试*

*测试

*测试(已在 Maven Surefire 插件 2.20 中添加)

*测试用例

如果您的测试类不遵循这些约定,您应该重命名它或 configure Maven Surefire Plugin 为测试类使用另一种模式。


我发现更改 maven 配置更有吸引力。这种命名约定确实会给没有经验的用户带来一些危险。将您的测试用例命名为 SomethingTest1、SomethingTest2 将导致测试不会被静默执行。 Maven 不能这样做以实现向后兼容性,但它确实结合了更多逻辑来搜索所有文件中的测试用例。
我从来不知道这一点 - 有两个案例以“测试”结尾,而 maven 拒绝运行它们……改为“测试”,棒棒糖公会再次一切正常。谢谢。
@Tobias 我同意你关于命名约定带来的危险的观点。它也打破了使用注释所暗示的模式。使用注解的一个隐含结果是可以搜索具有特定注解的类/方法。我希望 Maven 没有设置命名约定限制,而是仅依赖于扫描任何类中的 @Test 注释方法。
请注意,surefire 文档now 声称 **/*Tests.java 是默认包含!
问题:那么,如果您必须遵循 Test* 约定,为什么还要使用 @test 进行注释呢?
P
Paul Verest

我还发现单元测试代码应该放在src/test/java文件夹下,如果放在主文件夹下,它不能被识别为测试类。例如。

错误的

/my_program/src/main/java/NotTest.java

正确的

/my_program/src/test/java/MyTest.java

谢谢你!这并在 pom.xml 文件中将范围设置为测试 (<scope>test<scope>) 为我做了这件事。
我遇到了这个,注意测试与测试。正确的是测试
谢谢,那是我的问题,感谢您的评论,我解决了。
P
Paul Verest

更新:

就像@scottyseus 在评论中所说,从 Maven Surefire 2.22.0 开始,以下内容就足够了:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.1</version>
</plugin>

使用 JUnit 5 时,我遇到了同样的问题。 Maven Surefire 需要一个插件来运行 JUnit 5 测试。将此添加到我们的 pom.xml

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.21.0</version>
    <dependencies>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-surefire-provider</artifactId>
            <version>1.2.0-M1</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.2.0-M1</version>
        </dependency>
    </dependencies>
</plugin>

来源:https://junit.org/junit5/docs/current/user-guide/#running-tests-build-maven

2021 年更新

junit-platform-surefire-provider 最初由 JUnit 团队开发,在 JUnit Platform 1.3 中已弃用,并在 1.4 中停止使用。请改用 Maven Surefire 的原生支持。


我收到 junit-platform-surefire-provider 的“未找到”。
请注意,对于 Surefire 2.22,不必添加对 surefire-providerjupiter-engine 工件的依赖项。至少,在没有它们的情况下,我的测试似乎运行良好。见this answer
还值得注意的是,使用此插件时必须使用 org.junit.jupiter.api.Test 而不是 org.junit.Test,否则将找不到测试。
当添加了带有junit 5依赖项的surefire插件时有效
@austin_ce 就是这样!同时,这使得它与 mockito @Mock 不兼容,整个测试模块变得无用:(现在需要解决方案:)
J
Jon

如果未正确声明模块的打包,则可能导致 Maven 找不到测试的另一件事。

在最近的一个案例中,有人有 <packaging>pom</packaging>,而我的测试从未运行过。我将其更改为 <packaging>jar</packaging>,现在它工作正常。


很棒的建议!演示将单模块 Maven 工件拆分为多个时“复制粘贴”的危险。
我希望 maven 打印一条消息 - package type is pom - so not running tests - 为开发人员提供一些线索:(
很棒的发现!应该有一个测试
但是由于我的项目需要它(多模块项目),有没有办法让它与 pom 的打包一起使用?
D
Duc Tran

在我的例子中,它添加了 junit-vintage-engine 使其与旧版本的 JUnit 测试兼容并可以运行它们。因为我正在使用 JUnit 5。

<dependency>
        <groupId>org.junit.vintage</groupId>
        <artifactId>junit-vintage-engine</artifactId>
        <scope>test</scope>
</dependency>

我认为 SpringBoot 只包括它使用的内容。您必须根据需要指定依赖项是有道理的。否则,您将导入一大堆您不使用的库。
仅供参考,这实际上在 the Spring Boot 2.4 upgrade instructions 中提到
E
Exterminator13

如果您使用 Spring Initializr 创建了一个 Spring Boot 应用程序,那么测试就可以从 Intellij Idea 运行。但是,如果尝试从命令行运行测试:

mvn clean test

您可能会感到惊讶,根本没有运行任何测试。我尝试添加 surefire plugin,但没有成功。答案很简单:pom.xml 包含以下依赖项:

     <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
           <exclusion>
              <groupId>org.junit.vintage</groupId>
              <artifactId>junit-vintage-engine</artifactId>
           </exclusion>
        </exclusions>
     </dependency>

排除项 junit-vintage-engine 专用于保持与 JUnit 4.x 的向后兼容性。所以,新版本的 Spring Boot Initializr 默认不支持。在我删除排除项后,Maven 开始查看项目的测试。


大帮助。谢谢。默认运行程序是 JUnit5,即使您可以从上下文菜单手动运行测试,它也不会在终端中运行,直到您删除您提到的排除项。
我没有排除,但必须明确指定依赖 junit-vintage-engine。我认为这是隐含的,但事实并非如此。
我有同样的问题。谢谢。我当时想:为什么不运行。有些评论实际上建议排除junit年份......
我也没有排除但junit 4测试不起作用。添加 junit-vintage-engine 后,它起作用了,谢谢。
t
t3rmin41

此外,检查您的测试类目录(例如 src/test/java)是否对应于您的 pom.xml 中 <build> 属性下的属性 <testSourceDirectory> 中列出的目录。我花了一段时间才找到。


这也对我有用。我在 build 标签下添加了这个属性,这使得 maven 将测试类编译到名为 test-classes 的文件夹下的目标文件夹中。这是surefire插件为了运行测试而检查的默认目录。
J
João Matos

其中许多答案在过去对我非常有用,但我想添加一个花费我一些时间的额外场景,因为它可能会在未来帮助其他人:

确保测试类和方法是公开的。

我的问题是我正在使用我的 IDE (IntelliJ) 的自动测试类/方法生成功能,并且由于某种原因,它将它们创建为包私有。我发现这比人们预期的更容易错过。


这也是我遇到的问题,由于某种原因,IntelliJ 将测试创建为包私有,而 Maven 看不到它们。将类和 @Test 方法更改为 public 使 Maven 执行测试。
解决了我的问题!请注意,这不适用于 JUnit 5+。我猜 IntelliJ 的代码生成器假定您使用的是最新版本。
@lamino我正在使用junit5并且它失败了,因为我的测试方法不是公开的
IntelliJ 有点厚颜无耻地告诉我这些方法可以是包私有的..
e
edubriguenti

我在这个问题上挣扎。就我而言,我没有导入正确的 @Test 注释。

1) 检查@Test 是否来自 org.junit.jupiter.api.Test(如果您使用的是 Junit 5)。

2) 使用 Junit5 而不是 @RunWith(SpringRunner.class),使用 @ExtendWith(SpringExtension.class)

import org.junit.jupiter.api.Test;

@ExtendWith(SpringExtension.class)
@SpringBootTest
@AutoConfigureMockMvc
@TestPropertySource(locations = "classpath:application.properties")    
public class CotacaoTest {
    @Test
    public void testXXX() {

    }
}

对我来说,在使用 org.junit.jupiter.api.Test 之后工作。我不需要使用@ExtendWith(SpringExtension.class)
使用它时,它适用于 maven,但 junit 无法再运行测试(错误的测试类)
r
robjwilkins

如果项目有 <packaging>pom</packaging>,Maven 将不会运行您的测试

您需要将包装设置为 jar(或其他一些 java 人工制品类型)才能运行测试:<packaging>jar</packaging>


但是由于我的项目需要它(多模块项目),有没有办法让它与 pom 的打包一起使用?
u
user1016765

发现如果您在测试前加上“抽象”前缀,默认情况下它也会被忽略。


maven.apache.org/guides/getting-started ``` 并且默认排除是:*/AbstractTest.java */AbstractTestCase.java ```
它似乎也忽略了 */TestAbstractSomeClassName.java
M
Mitra

检查(对于 jUnit - 4.12 和 Eclipse surefire 插件)

在依赖项中的 POM.xml 中添加所需的 jUnit 版本。执行 Maven -> 更新项目以查看项目中导出的所需 jar。测试类位于文件夹 src/test/java 和该文件夹的子目录下(或者基本文件夹可以在 POM 中的 config testSourceDirectory 中指定)。类的名称应该有尾词“测试”。测试类中的测试方法应该有注解@Test


这更像是一个 java 配置问题,但是除了正确命名测试类并将测试文件放在 src 下的测试目录中之外,测试类的包名必须与您正在测试的类的包名匹配。
@Paul False - Maven 将执行 all classes matching the convention under src/test/java。包约定用于结构并允许测试访问包私有方法。
A
A. S. Ranjan

以下在 Junit 5 中对我来说效果很好

https://junit.org/junit5/docs/current/user-guide/#running-tests-build-maven

<build>
    <plugins>
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.0</version>
        </plugin>
        <plugin>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.22.0</version>
        </plugin>
    </plugins>
</build>
<!-- ... -->
<dependencies>
    <!-- ... -->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.4.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.4.0</version>
        <scope>test</scope>
    </dependency>
    <!-- ... -->
</dependencies>
<!-- ... -->

谢谢。在您的示例中,您包括 junit-jupiter-api 和 junit-jupiter-engine。使用相同的我在构建阶段遇到了一些错误。但是,按照您提供的链接,我了解到仅包含 junit-jupiter(版本 5.6.2)可以正常工作。
我不必导入插件。添加 junit-jupiter-engine 依赖项完成了工作。
r
rajesh madhavan

我也有类似的问题,经过探索发现 testng 依赖导致了这个问题。从 pom 中删除 testng 依赖项后(因为我不再需要它),它开始对我正常工作。

    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>6.8</version>
        <scope>test</scope>
    </dependency>

M
Michael Hegner

就我而言,我们正在将多模块应用程序迁移到 Spring Boot。不幸的是,maven 不再在模块中执行所有测试。测试类的命名没有改变,我们遵循命名约定。

最后,当我将依赖项 surefire-junit47 添加到插件 maven-surefire-plugin 时,它有所帮助。但我无法解释,为什么,这是反复试验:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<dependencies>
  <dependency>
    <groupId>org.apache.maven.surefire</groupId>
    <artifactId>surefire-junit47</artifactId>
    <version>${maven-surefire-plugin.version}</version>
  </dependency>
</dependencies>


谢谢 - 这只是对我们有用的十几种解决方案。
几分钟前我在 Surefire 文档中读到过它,所以一旦看到这个答案就决定立即尝试。现在执行 1120 而不是 150 这听起来像是一个不错的进步,但距离运行所有测试还有很长的路要走......
R
Raedwald

Maven Surefire 插件支持多种测试框架。它会尝试自动检测您正在使用的框架,然后查找使用该框架编写的测试。如果该自动检测被混淆,并且选择了错误的框架,那么第二阶段将找不到您的测试。

自动检测通过扫描类路径以查找其支持的测试框架的重要“驱动程序”类的存在。因此,如果您的 POM 或依赖的模块对这些“驱动程序”类之一具有不正确的依赖关系,则自动检测可能会出错。

目前(2020 年),一个特殊的问题是 JUnit 4 和 JUnit 5 之间的差异。Surefire 插件将它们视为不同的框架。但是由于包名称的相似性,一个项目可能依赖于错误的框架,但随便检查一下似乎没问题。

特别要注意的是,junit-platform-console 用于 JUnit 5,而 junit-platform-runner 用于 JUnit 4。如果您的项目依赖于后者,Surefire 将不会运行您的 JUnit 5 测试。


S
Saikat

如果您的测试类名称不遵循标准命名约定(如上面 @axtavt 突出显示的那样),您需要在 pom.xml 中添加模式/类名称以便 Maven 选择测试 -

...
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <includes>
                    <include>**/*_UT.java</include>
                </includes>
            </configuration>
        </plugin>
    </plugins>
</build> 
...

但请注意,这将覆盖默认配置。如果您还有根据模式 *Test.java 命名的测试类,这些将不会被执行!
b
bruce szalwinski

如果您有一个共享的 Java/Groovy 应用程序并且您只有 Groovy 单元测试,那么 Maven 将找不到任何测试。这可以通过在 src/test/java 下添加一个单元测试来解决。


B
Boris Z.
/my_program/src/test/java/ClassUnderTestTests.java

应该

/my_program/src/test/java/ClassUnderTestTest.java

Maven 找到那些以 Test 结尾或以 Test 开始以自动运行。

但是,您可以使用

mvn surefire:test -Dtest=ClassUnderTestTests.java 

运行您的测试。


f
fIwJlxSzApHEZIl

这是我必须添加到我的 pom.xml 中的确切代码:

    <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.21.0</version>
            <dependencies>
                <dependency>
                    <groupId>org.junit.platform</groupId>
                    <artifactId>junit-platform-surefire-provider</artifactId>
                    <version>1.2.0-M1</version>
                </dependency>
                <dependency>
                    <groupId>org.junit.jupiter</groupId>
                    <artifactId>junit-jupiter-engine</artifactId>
                    <version>5.2.0</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

这是我的依赖项:

    <dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.2.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.easytesting</groupId>
        <artifactId>fest-assert-core</artifactId>
        <version>2.0M10</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-surefire-provider</artifactId>
        <version>1.2.0-M1</version>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.2.0-M1</version>
    </dependency>
</dependencies>

最后,在尝试了所有其他选项之后,这对我有用
S
ShayneR

我遇到了同样的问题,它通过 pom.xml 中的以下更改解决:

<build>
    <testSourceDirectory>test</testSourceDirectory>

...

变成:

<build>
    <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>

l
luukvhoudt

可能不是一个常见的错误,但除了 @João Matos 的答案。除了您的方法公开的要求之外:

您的方法也应该是 void,当然还有 @Test 注释。

这不起作用:

@Test
public Integer fooBarTest() {
   // omitted
}

它必须返回一个 void

@Test
public void fooBarTest() {
   // omitted
}

d
datv

还有一个提示(除了以前的答案):

在 Eclipse 中,转到项目的 Properties >点击Run/Debug Settings

“此页面允许您使用当前选定的资源管理启动配置”

在那里,您可以添加(新建...)或删除(删除)您在项目中拥有的任何 JU (JUnit) 测试(在 src/test/java 文件夹或课程下)。


R
Rostislav V

就我而言,我的父母 pom 有一个父母:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>some version</version>
    <relativePath/>
</parent>

改为导入spring pom后:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>some version</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

我的单元测试开始运行


该解决方案适用于我的问题,但更具挑战性;我的 Spring Boot 3.4.12 应用程序在本地运行测试,但在 GCP Cloud Build 期间跳过了它们。
B
Benjamin

使用 Surefire 插件,您可能希望包含所有用于测试的文件:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.0.0-M5</version>
    <configuration>
        <includes>
            <include>*</include>
        </includes>
    </configuration>
</plugin>

通过这种方式,您可以测试所有文件,而不仅仅是包含 Surefire 所需模式的文件。


R
Rusi Popov

不运行测试用例的另一个原因发生在我身上——我有一个名为“test”的属性用于完全不同的目的,但它干扰了surefire插件。因此,请检查您的 POM:

<properties>
  <test>.... </test>
  ...
</properties>

并将其删除。


y
youhans

如果您已经在 JUnit 4 中编写了测试并将 JUnit 5 依赖项添加到了 surefire 插件中,那么您的测试将不会运行。

在这种情况下,只需注释来自 surefire 插件的 JUnit 5 依赖项:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19.1</version>
            <!--<dependencies>-->
                <!--<dependency>-->
                    <!--<groupId>org.junit.platform</groupId>-->
                    <!--<artifactId>junit-platform-surefire-provider</artifactId>-->
                    <!--<version>1.0.0</version>-->
                <!--</dependency>-->
                <!--<dependency>-->
                    <!--<groupId>org.junit.jupiter</groupId>-->
                    <!--<artifactId>junit-jupiter-engine</artifactId>-->
                    <!--<version>${junit.version}</version>-->
                <!--</dependency>-->
            <!--</dependencies>-->
        </plugin>

w
walkeros

当您将 surfire 插件 3.x.x+ 与 JUnit5 一起使用并错误地使用 JUnit4 的 @Test 注释对测试类进行注释时,可能会出现此类问题。

使用:org.junit.jupiter.api.Test (JUnit5) 而不是 org.junit.Test (Junit4)

注意:这可能很难注意到,因为 IDE 可能会像 JUnit4 测试一样运行它而没有问题。


M
Mark W

我最近遇到的另一个容易被忽视的问题 - 确保您的测试类文件具有 .java 扩展名。如果没有要编译的测试,就没有要运行的测试


类文件被编译为 .class 与测试源文件无关。
我指的是测试类,当我说类我不是指文件类型时,你误解了。我会让我的答案更清楚
A
Ajay V

在使用 Junit4 进行 Spring Boot 项目设置时遇到了这个问题。 Jacoco maven 插件总是返回 0.00 的测试覆盖率,而 maven surefire 插件运行了 0 次测试。

删除了 junit-vintage-engine 和 surefire-junit47 依赖项,并添加了以下依赖项来运行 Junit 5 单元测试。

 <dependency>
   <groupId>org.junit.jupiter</groupId>
   <artifactId>junit-jupiter-engine</artifactId>
   <version>5.6.2</version>
   <scope>test</scope>
 </dependency>

添加低于 5.6.2 的版本导致 ScriptEvaluationException。

也使用@ExtendWith(SpringExtension.class) 而不是@RunWith(SpringRunner.class)