search
  • Sign In
  • Sign Up
Password reset successful

Follow the proiects vou are interested in andi aet the latestnews about them taster

Table of Contents
Understanding Maven Surefire Plugin and test execution
Test discovery mechanism changes in Surefire 2.7 version
Diagnose tests not running: use surefire.junit4.upgradecheck
Fix test not running issue
Summarize
Home Java javaTutorial Maven Surefire Plugin test execution incomplete problem analysis and solution

Maven Surefire Plugin test execution incomplete problem analysis and solution

Dec 01, 2025 am 12:39 AM

Maven Surefire Plugin test execution incomplete problem analysis and solution

This article deeply explores the differences in test execution behavior of Maven Surefire Plugin under different versions, especially the changes in the test discovery mechanism introduced starting from version 2.7. When you upgrade your Surefire version and find that some JUnit tests fail to execute, this is usually due to the fact that the tests no longer meet the new definition of "valid JUnit tests". This article will guide how to use the -Dsurefire.junit4.upgradecheck parameter to diagnose problems and provide corresponding solutions to ensure that all expected tests can run correctly.

Understanding Maven Surefire Plugin and test execution

Maven Surefire Plugin is a plug-in in Apache Maven projects for executing unit tests during the build life cycle. It is responsible for discovering, executing tests in the project, and generating test reports. Typically, developers only need to declare the plugin in pom.xml and Maven will automatically handle test execution.

 <?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.example</groupid>
    <artifactid>weatherProject</artifactid>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupid>org.apache.maven.plugins</groupid>
                <artifactid>maven-surefire-plugin</artifactid>
                <version>2.22.1</version> <!-- The version used in the example -->
            </plugin>
        </plugins>
    </build>
    <!-- ...Other project configurations... -->
</project>

However, when upgrading the maven-surefire-plugin version, you may encounter the problem that some tests are no longer executed. For example, after upgrading from 2.20 to 2.22.1, the integration tests and unit tests that were originally run suddenly only partially execute (such as Mock and Smoke tests). This is usually not a bug in the plugin, but a change in its test discovery mechanism.

Test discovery mechanism changes in Surefire 2.7 version

The root of the problem is that the Surefire Plugin's algorithm for selecting and executing tests has changed significantly since version 2.7 .

  • Older versions (prior to 2.7): JUnit tests that merely satisfy the naming convention (such as classes ending in Test) but are not strictly "valid" may be executed.
  • New versions (2.7 and later): Only run valid JUnit tests. This means that if a class conforms to the naming convention, but does not have the correct JUnit annotations (such as @Test) or does not conform to JUnit's test class structure requirements, it will not be executed.

This change is intended to improve the accuracy and efficiency of test execution and avoid executing classes that are not actually tests. Therefore, when upgrading from an older Surefire version to 2.7 or higher, if there are some "non-standard" JUnit tests in the project, they may no longer be recognized and executed by Surefire.

Diagnose tests not running: use surefire.junit4.upgradecheck

To help developers identify these potential problem tests when upgrading Surefire versions, the Surefire Plugin provides a very useful diagnostic tool: the -Dsurefire.junit4.upgradecheck flag.

What it does: When using Surefire 2.7 or later, running a Maven build with this flag, the plugin will perform a check to identify tests that may have been executed in older versions, but will not be executed in the current version because they do not meet the "valid JUnit test" criteria.

Behavior: If any such "invalid" tests are found, the build will fail with a detailed warning message indicating which test class or method is problematic. This allows developers to know exactly which tests need to be modified to adapt to the new Surefire behavior.

How to use:

When executing Maven tests from the command line, add this system property:

 mvn test -Dsurefire.junit4.upgradecheck

Things to note:

  • This flag is only used as a diagnostic tool when upgrading. It is a transitional feature and may be removed in future versions of Surefire.
  • Once all problem tests have been identified and fixed, there is no need to use this flag.

Fix test not running issue

Once the surefire.junit4.upgradecheck flag has helped you identify tests that were not run, the next step is to fix those tests based on the diagnostic information:

  1. Check JUnit annotations: Make sure all test methods use the @Test annotation correctly. With JUnit 4, test classes are usually required to have the @RunWith annotation (such as @RunWith(JUnit4.class) or @RunWith(SpringRunner.class), etc.), although this is not mandatory for simple test classes. For JUnit 5, test classes and methods need to use annotations such as org.junit.jupiter.api.Test.
  2. Verify test class structure:
    • Test classes should generally be public.
    • Test methods should also be public and have no parameters.
    • Make sure that no test classes or test methods are marked abstract.
    • For JUnit 4, make sure the test class has no constructor, or has a parameterless public constructor.
  3. Follow naming conventions (auxiliary): Although Surefire 2.7 version focuses more on effectiveness than just naming, following standard naming conventions (such as *Test.java, Test*.java, *TestCase.java) is still a good practice and can help Surefire plug-ins discover tests more efficiently.
  4. Check dependencies: Make sure the correct version of JUnit dependencies is included in the project and there are no version conflicts.

Summarize

When the problem of some tests not being executed occurs after the maven-surefire-plugin is upgraded, it is usually due to the change in the test discovery mechanism introduced in Surefire 2.7 version. By leveraging the -Dsurefire.junit4.upgradecheck diagnostic flag, you can effectively locate and fix tests that do not meet the criteria for a "valid JUnit test". Following JUnit best practices and ensuring the correctness of the test code structure and annotations is the key to avoiding such problems. When upgrading the plug-in version, consulting the change log in the official documentation is also an indispensable step.

The above is the detailed content of Maven Surefire Plugin test execution incomplete problem analysis and solution. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undress AI Tool

Undress AI Tool

Undress images for free

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

ArtGPT

ArtGPT

AI image generator for creative art from text prompts.

Stock Market GPT

Stock Market GPT

AI powered investment research for smarter decisions

Popular tool

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

How to configure Spark distributed computing environment in Java_Java big data processing How to configure Spark distributed computing environment in Java_Java big data processing Mar 09, 2026 pm 08:45 PM

Spark cannot run in local mode, ClassNotFoundException: org.apache.spark.sql.SparkSession. This is the most common first step of getting stuck: even the dependencies are not correct. Only spark-core_2.12 is written in Maven, but spark-sql_2.12 is not added. SparkSession crashes as soon as it is built. The Scala version must strictly match the official Spark compiled version - Spark3.4.x uses Scala2.12 by default. If you use spark-sqljar of 2.13, the class loader cannot directly find the main class. Practical advice: Go to mvnre

How to safely map user-entered weekday string to integer value and implement date offset operation in Java How to safely map user-entered weekday string to integer value and implement date offset operation in Java Mar 09, 2026 pm 09:43 PM

This article introduces a concise and maintainable way to map the weekday string (such as "Monday") to the corresponding serial number (1-7), and use the modulo operation to realize the forward and backward offset of any number of days (such as Monday plus 4 days to get Friday), avoiding lengthy if chains and hard-coded logic.

How to generate a list of duplicate elements using Java's Collections.nCopies_Initialization tips How to generate a list of duplicate elements using Java's Collections.nCopies_Initialization tips Mar 06, 2026 am 06:24 AM

Collections.nCopies returns an immutable view. Calling add/remove will throw UnsupportedOperationException; it needs to be wrapped with newArrayList() to modify it, and it is disabled for mutable objects.

How to use Homebrew to install Java on Mac_A must-have Java tool chain for developers How to use Homebrew to install Java on Mac_A must-have Java tool chain for developers Mar 09, 2026 pm 09:48 PM

Homebrew installs the latest stable version of openjdk (such as JDK22) by default, not the LTS version; you need to explicitly execute brewinstallopenjdk@17 or brewinstallopenjdk@21 to install the LTS version, and manually configure PATH and JAVA_HOME to be correctly recognized by the system and IDE.

What is exception masking (Suppressed Exceptions) in Java_Multiple resource shutdown exception handling What is exception masking (Suppressed Exceptions) in Java_Multiple resource shutdown exception handling Mar 10, 2026 pm 06:57 PM

What is SuppressedException: It is not "swallowed", but actively archived by the JVM. SuppressedException is not an exception loss, but the JVM quietly attaches the secondary exception to the main exception under the premise that "only one exception must be thrown" for you to verify afterwards. It is automatically triggered by the JVM in only two scenarios: one is that the resource closure in try-with-resources fails, and the other is that you manually call addSuppressed() in finally. The key difference is: the former is fully automatic and safe; the latter requires you to keep it to yourself, and it can be written as shadowing if you are not careful. try-

How to correctly implement runtime file writing in Java applications (avoiding JAR internal write failures) How to correctly implement runtime file writing in Java applications (avoiding JAR internal write failures) Mar 09, 2026 pm 07:57 PM

After a Java application is packaged as a JAR, data cannot be written directly to the resources in the JAR package (such as test.txt) because the JAR is essentially a read-only ZIP archive; the correct approach is to write variable data to an external path (such as a user directory, a temporary directory, or a configuration-specified path).

What is the underlying principle of array expansion in Java_Java memory dynamic adjustment analysis What is the underlying principle of array expansion in Java_Java memory dynamic adjustment analysis Mar 09, 2026 pm 09:45 PM

ArrayList.add() triggers expansion because grow() is called when size is equal to elementData.length. The first add allocates 10 capacity, and subsequent expansion is 1.5 times and not less than the minimum requirement, relying on delayed initialization and System.arraycopy optimization.

How to safely read a line of integer input in Java and avoid Scanner blocking How to safely read a line of integer input in Java and avoid Scanner blocking Mar 06, 2026 am 06:21 AM

This article introduces typical blocking problems when using Scanner to read multiple integers in a single line. It points out that hasNextInt() will wait indefinitely when there is no subsequent input, and recommends a safe alternative with nextLine() string splitting as the core.

Related articles