使用 Cache2K 在 Spring 缓存项目中构建 Maven 期间使用 @SpringBootTest 进行的多项测试失败
Multiple tests with @SpringBootTest fail during Maven build in Spring Cache project with Cache2K
我有一个 Spring Boot REST 项目,其中包含多个 @SpringBootTest JUnit 测试用例。
该项目使用 Spring 带有 Cache2K 的缓存。有一个工厂 bean 创建带有缓存的 CacheManager。
@Bean
public CacheManager cache2kCacheManager() {
SpringCache2kCacheManager cache2kCacheManager = new SpringCache2kCacheManager()
.defaultSetup(b -> b.entryCapacity(3).expireAfterWrite(3, TimeUnit.SECONDS).disableMonitoring(false));
Function<Cache2kBuilder<?, ?>, Cache2kBuilder<?, ?>> campaignCacheBuilder;
campaignCacheBuilder = x -> x.name("campaigns-cache")
.entryCapacity(5));
cache2kCacheManager.addCaches(campaignCacheBuilder);
return cache2kCacheManager;
}
当 运行 在 IDE 时,所有测试用例 运行 成功。该应用程序在 IDE 中启动时也会 运行s。然而,当我在项目上 运行 mvn clean install
时,测试用例由于缓存对象创建错误而失败。
[ERROR] testCacheReadAndWrite Time elapsed: 0 s <<< ERROR!
java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cache2kCacheManager' defined in class path resource [com/demos/cachedemo/cache/configuration/Cache2KConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.cache.CacheManager]: Factory method 'cache2kCacheManager' threw exception; nested exception is java.lang.IllegalStateException: Cache already created: 'campaigns-cache'
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.cache.CacheManager]: Factory method 'cache2kCacheManager' threw exception; nested exception is java.lang.IllegalStateException: Cache already created: 'campaigns-cache'
Caused by: java.lang.IllegalStateException: Cache already created: 'campaigns-cache'
我尝试删除错误的测试用例,但其他人开始失败并出现相同的异常。上下文似乎是 reused/shared。我已经将 @DirtiesContext 添加到测试用例中,但这并不能解决问题。
谁能帮我解决这个问题?
更新 1:该项目是使用 start.spring.io 创建的,并且在 pom.xml 中具有默认构建插件。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
问题是由于 Maven Surefire 并行测试 运行。 This answer 提供了解决问题的方法。
该项目是使用 start.spring.io 创建的并且具有默认构建插件(我已经使用之前的构建配置编辑了问题)。
我添加了以下 Surefire 配置来限制并行运行。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<reuseForks>false</reuseForks>
<forkCount>1</forkCount>
</configuration>
</plugin>
</plugins>
</build>
如果有更好的解决办法,请post吧。
我有一个 Spring Boot REST 项目,其中包含多个 @SpringBootTest JUnit 测试用例。
该项目使用 Spring 带有 Cache2K 的缓存。有一个工厂 bean 创建带有缓存的 CacheManager。
@Bean
public CacheManager cache2kCacheManager() {
SpringCache2kCacheManager cache2kCacheManager = new SpringCache2kCacheManager()
.defaultSetup(b -> b.entryCapacity(3).expireAfterWrite(3, TimeUnit.SECONDS).disableMonitoring(false));
Function<Cache2kBuilder<?, ?>, Cache2kBuilder<?, ?>> campaignCacheBuilder;
campaignCacheBuilder = x -> x.name("campaigns-cache")
.entryCapacity(5));
cache2kCacheManager.addCaches(campaignCacheBuilder);
return cache2kCacheManager;
}
当 运行 在 IDE 时,所有测试用例 运行 成功。该应用程序在 IDE 中启动时也会 运行s。然而,当我在项目上 运行 mvn clean install
时,测试用例由于缓存对象创建错误而失败。
[ERROR] testCacheReadAndWrite Time elapsed: 0 s <<< ERROR!
java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cache2kCacheManager' defined in class path resource [com/demos/cachedemo/cache/configuration/Cache2KConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.cache.CacheManager]: Factory method 'cache2kCacheManager' threw exception; nested exception is java.lang.IllegalStateException: Cache already created: 'campaigns-cache'
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.cache.CacheManager]: Factory method 'cache2kCacheManager' threw exception; nested exception is java.lang.IllegalStateException: Cache already created: 'campaigns-cache'
Caused by: java.lang.IllegalStateException: Cache already created: 'campaigns-cache'
我尝试删除错误的测试用例,但其他人开始失败并出现相同的异常。上下文似乎是 reused/shared。我已经将 @DirtiesContext 添加到测试用例中,但这并不能解决问题。
谁能帮我解决这个问题?
更新 1:该项目是使用 start.spring.io 创建的,并且在 pom.xml 中具有默认构建插件。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
问题是由于 Maven Surefire 并行测试 运行。 This answer 提供了解决问题的方法。
该项目是使用 start.spring.io 创建的并且具有默认构建插件(我已经使用之前的构建配置编辑了问题)。
我添加了以下 Surefire 配置来限制并行运行。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<reuseForks>false</reuseForks>
<forkCount>1</forkCount>
</configuration>
</plugin>
</plugins>
</build>
如果有更好的解决办法,请post吧。