Spring Support
Requires pitest 1.16.0 or above. Minimum Java version 11.
Provided by the arcmutate-spring plugin.
Background
Teams using pitest with spring face two issues
- Tests using spring test extensions may fail to detect mutants
- Important functionality is determined by annotations instead of Java code
The arcmutate spring plugin addresses both these issues.
Spring Environment Support
The plugin automatically clears the spring context after each test, ensuring that mutated code is executed. This is similar to adding @DirtiesContext(classMode = AFTER_EACH_TEST_METHOD)
to each spring test class, but caches of values that spring holds outside the context are also cleared.
Tests which rely on state persisting between test methods may fail as a result of the context being cleared. These tests will need to be excluded from the analysis, or rewritten so they can be run in isolation.
It is important to note that, even with the spring plugin installed, pitest only supports mutation testing with unit tests that run all code and tests within the same jvm. It cannot be used with integration tests that launch a web server.
Performance Note
We recommend that your test suite uses Spring test extensions only sparingly. Where possible, plain unit tests with no knowledge of the spring framework should be preferred. Tests that must launch all (or part) of spring execute far more slowly than plain unit tests, and increase feedback time as a project grows. Mutation testing amplifies this problem.
When it is not possible to write a plain unit test, we recommend using Spring’s test slices.
Annotation Mutations
The plugin currently provides several new mutation operators. They can be enabled individually, or all mutators can be enabled by using the mutator group “SPRING”.
REMOVE_VALIDATION
Removes the following annotations from classes, fields, methods and method parameters.
- jakarta.validation.constraints.Min
- jakarta.validation.constraints.Max
- jakarta.validation.constraints.NotEmpty
- jakarta.validation.constraints.Pattern
- javax.validation.constraints.Min
- javax.validation.constraints.Max
- javax.validation.constraints.NotEmpty
- javax.validation.constraints.Pattern
REMOVE_SECURITY
Removes the following annotations from classes, fields, methods and method parameters.
- org.springframework.security.access.prepost.PreAuthorize
- org.springframework.security.access.prepost.PostAuthorize
- jakarta.annotation.security.RolesAllowed
- org.springframework.security.access.prepost.PreFilter
- org.springframework.security.access.prepost.PostFilter
- org.springframework.security.access.annotation.Secured
REMOVE_RESPONSE
Removes the following annotations from classes, fields, methods and method parameters.
- org.springframework.web.bind.annotation.ResponseStatus
- org.springframework.web.bind.annotation.ResponseBody
Installation
To you use the plugin you must first acquire a licence.
The licence file must be named arcmutate-licence.txt
and placed at the root of the project.
The plugin itself should be placed on the classpath of the pitest plugin.
E.g for maven
<plugin>
<groupId>org.pitest</groupId>
<artifactId>pitest-maven</artifactId>
<version>1.16.1</version>
<configuration>
<mutators>
<mutator>DEFAULTS</mutator>
<mutator>SPRING</mutator>
</mutators>
</configuration>
<dependencies>
<dependency>
<groupId>com.arcmutate</groupId>
<artifactId>arcmutate-spring</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</plugin>
Or for gradle
dependencies {
pitest 'com.arcmutate:arcmutate-spring:1.0.0'
}
Individual operators or groups should then be enabled using the standard pitest configuration options.