我想设置Spring Profile以便测试不同的JUnit测试集。我尝试过:
application.properties:
spring.profiles.active=dev
测试1
@IfProfileValue(name = "spring.profiles.active", values = {"test"})
@ActiveProfiles(profiles = {"test"})
public class SecondGenericTest {
@Test
public void secGenericTest() {
System.out.println("Performing test ... for profile test");
}
}
测试2
@IfProfileValue(name = "spring.profiles.active", values = {"test"})
@ActiveProfiles(profiles = {"test"})
public class SecondGenericTest {
@Test
public void secGenericTest() {
System.out.println("Performing test ... for profile test");
}
}
试图也将其设置为InteliJ Active配置文件:
但是每次都执行两个测试。是否有一些解决方案可以使用适当的活动配置文件运行测试?
POM配置:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-bean-validators</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>2.5.4</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<dependency>
<groupId>plugin</groupId>
<artifactId>org.plugin</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.10.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.10.2.1</version>
</dependency>
<dependency>
<groupId>org.codehaus.woodstox</groupId>
<artifactId>woodstox-core-asl</artifactId>
<version>4.4.1</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0.1</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>8.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-core</artifactId>
</dependency>
<dependency>
<groupId>io.reactivex.rxjava2</groupId>
<artifactId>rxjava</artifactId>
</dependency>
<!-- Dependency for for Netty. Remove it when WebFlux is not used -->
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-transport-native-epoll</artifactId>
<version>4.1.45.Final</version>
<classifier>linux-x86_64</classifier>
</dependency>
<!-- Packages for testing -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.6.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.6.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.2.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.6.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.restdocs</groupId>
<artifactId>spring-restdocs-mockmvc</artifactId>
<version>2.0.4.RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-engine</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-commons</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>1.6.0</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>test</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
<configuration>
<archive>
<manifestEntries>
<Dependencies>jdk.unsupported</Dependencies>
</manifestEntries>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>12</release>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M4</version>
</plugin>
</plugins>
</build>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<repositories>
<repository>
<id>repository.spring.release</id>
<name>Spring GA Repository</name>
<url>http://repo.spring.io/release</url>
</repository>
<repository>
<id>sonatype-releases</id>
<url>https://oss.sonatype.org/content/repositories/releases/</url>
</repository>
<repository>
<id>java.net</id>
<url>https://maven.java.net/content/repositories/public/</url>
</repository>
<repository>
<id>JBoss repository</id>
<url>http://repository.jboss.org/nexus/content/groups/public/</url>
</repository>
<repository>
<id>jvnet-nexus-snapshots</id>
<name>jvnet-nexus-snapshots</name>
<url>https://maven.java.net/content/repositories/snapshots/</url>
</repository>
</repositories>
答案 0 :(得分:1)
如山姆·布兰嫩(Sam Brannen)在本answer中的解释:
如Javadoc中所述,
@IfProfileValue
用于表示 已针对特定的测试配置文件或环境启用了测试。而
@ActiveProfiles
用于声明哪个活动bean 加载ApplicationContext时应使用定义配置文件 用于测试课程。换句话说,您使用
@IfProfileValue
来控制是否进行测试 类或测试方法将被执行或跳过,您可以使用 @ActiveProfiles设置将要使用的活动bean定义配置文件 用于加载测试的ApplicationContext。
因此,在您的情况下,@ActiveProfile
应该可以解决问题。
此外,JUnit 5还允许您向测试中添加标签,该功能可以帮助您仅运行某些测试。
您可以使用@Tag("...")
批注来完成此操作,并通过将测试种类更改为您选择的标签,将其设置为configuration的参数
您还可以通过Maven配置标签以通过进行构建/发布
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M3</version>
<configuration>
<!-- include tags -->
<groups>integration, feature-168</groups>
<!-- exclude tags -->
<excludedGroups>slow</excludedGroups>
</configuration>
</plugin>
答案 1 :(得分:1)
我相信正确的语法应该是
@IfProfileValue(name = "spring.profiles.active", value = "test")
带有@IfProfileValue
注释的class的默认实现是ProfileValueSource
class,它查找系统属性-因此,您需要通过JVM属性来设置配置文件,即--Dspring.profiles.active="test"
不幸的是,@IfProfileValue
没有考虑通过@ActiveProfiles
或@Profile
指定的值
尽管@IfProfileValue和@Profile批注都涉及 配置文件,它们没有直接关系。 @Profile涉及bean 在环境中配置的定义配置文件;而, @IfProfileValue用于启用或禁用测试。
您可以看到默认的实现类at Github
在系统属性中查找键
@Override
public String get(String key) {
Assert.hasText(key, "'key' must not be empty");
return System.getProperty(key);
}
因此我们可以看到实际上我们不必专门设置spring profile,它可以是任何环境变量,可以通过System.getProperty(key);
调用来解决,例如test.active.profile
。
或者您可以创建自己的ProfileValueSource实现:
默认情况下,@IfProfile
在“系统属性”中显示,因此您需要提供ProfileValueSource
的实现才能从任何属性源读取。请注意,下面的示例仍会查看系统属性-这只是自定义解析器的示例。
public class MyProfileValueSource implements ProfileValueSource {
private final Properties testProperties;
public MyProfileValueSource() {
ClassPathResource resource = new ClassPathResource("test.properties");
if (resource.exists()) {
try {
this.testProperties = PropertiesLoaderUtils.loadProperties(resource);
} catch (IOException e) {
throw new RuntimeException(e);
}
} else {
testProperties = new Properties();
}
}
@Override
public String get(String key) {
return testProperties.getProperty(key, System.getProperty(key));
}
,然后在您的测试班级中引用它
@ExtendWith(SpringRunner.class)
@ContextConfiguration(classes = MyApplicationConfig.class)
@ProfileValueSourceConfiguration(MyProfileValueSource.class)
public class ServiceTests {
@Test
@IfProfileValue(name = "test.enabled", value = "true")
public void test() {
}
}
您可以提供所需的ProfileValueSource
的任何实现(例如,从任何其他属性源读取)