Java
javaTutorial
Maven Surefire Plugin test execution incomplete problem analysis and solution
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:
- 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.
- 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.
- 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.
- 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!
Hot AI Tools
Undress AI Tool
Undress images for free
AI Clothes Remover
Online AI tool for removing clothes from photos.
Undresser.AI Undress
AI-powered app for creating realistic nude photos
ArtGPT
AI image generator for creative art from text prompts.
Stock Market GPT
AI powered investment research for smarter decisions
Hot Article
Popular tool
Notepad++7.3.1
Easy-to-use and free code editor
SublimeText3 Chinese version
Chinese version, very easy to use
Zend Studio 13.0.1
Powerful PHP integrated development environment
Dreamweaver CS6
Visual web development tools
SublimeText3 Mac version
God-level code editing software (SublimeText3)
Hot Topics
20518
7
13631
4
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
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
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
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
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)
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
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
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.





