JUnit5 test exclusions based on Spring profile names
To prevent some JUnit5 tests from running when specific Spring Profiles are active simply implement the ExecutionCondition interface and interrogate the spring.profiles.active system property;
package com.example.project.config;
import org.junit.jupiter.api.extension.ConditionEvaluationResult;
import org.junit.jupiter.api.extension.ExecutionCondition;
import org.junit.jupiter.api.extension.ExtensionContext;
public class DisabledInProductionExtension implements ExecutionCondition {
@Override
public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext extensionContext) {
final String springProfileKey = "spring.profiles.active";
if (System.getProperties().containsKey(springProfileKey)) {
if (System.getProperties().get(springProfileKey).toString().contains("integration-test-production")) {
return ConditionEvaluationResult.disabled("Test disabled in production environment");
}
return ConditionEvaluationResult.enabled("Test enabled in non-production environment");
}
return ConditionEvaluationResult.enabled("No profile active, test enabled");
}
}And to use the Extension
package com.example.project;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import com.example.project.config.DisabledInProductionExtension;
@ExtendWith({DisabledInProductionExtension.class})
public class IntegrationTestForNonProductionEnvironment {
}To define multiple Extensions for different profiles we can create complimentary ExecutionCondition implementations. The framework will chain the invocations until one evaluates to disabled and exclude the annotated test accordingly.
package com.example.project;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import com.example.project.config.DisabledInProductionExtension;
import com.example.project.config.DisabledInStagingExtension;
@ExtendWith({DisabledInProductionExtension.class, DisabledInStagingExtension.class})
public class IntegrationTestForDevelopmentEnvironment {
}