Per*_*osh 5 java junit spring spring-boot spring-boot-test
在我的项目中,我们所有的测试都有一个超类。这是那个班级的签名
@RunWith(SpringRunner.class)
@SpringBootTest(value = {"management.port=0"}, classes = Application.class, webEnvironment = WebEnvironment.RANDOM_PORT)
@ActiveProfiles({"localhost", "test"})
@ContextConfiguration(classes = {Application.class, SomeConfiguration.class})
@Ignore
public abstract class AIntegrationTest {
Run Code Online (Sandbox Code Playgroud)
其中Application.class是我们的主类,而SomeConfiguration.class则仅用于一些@Bean和其他内容,没有什么花哨的地方。
我使用gradle,并且为了运行测试,我这样做:
./gradlew :my-project:test
Run Code Online (Sandbox Code Playgroud)
我的问题是:
由于初始化了多个上下文,因此上下文似乎相互重叠。我知道这是因为症状之一是此异常:
Caused by: org.springframework.jmx.export.UnableToRegisterMBeanException: Unable to register MBean [org.springframework.cloud.context.environment.EnvironmentManager@36408d9e] with key 'environmentManager'; nested exception is javax.management.InstanceAlreadyExistsException: RedeemAway:name=environmentManager,type=EnvironmentManager
Run Code Online (Sandbox Code Playgroud)即使我不关心加载的多个上下文,我的印象是,当一个测试完成时,下一个测试会在终止前一个测试之前获得一个新的上下文。我之所以这样说,是因为上面的异常重叠了。
由于所有测试共享同一个JVM,因此当某些bean被两次注册时,该异常就会出现。从此链接:
据说:
可以通过用于加载它的配置参数的组合来唯一标识ApplicationContext。因此,配置参数的唯一组合用于生成一个密钥,在该密钥下缓存上下文。TestContext框架使用以下配置参数来构建上下文缓存键
我了解这一点,但是,我想知道如何实现?我的目标是在同一个JVM上运行所有测试,并在每个测试中重用上下文。
2月22日星期四编辑
我尝试过的事情:
真正的禁用JMX应该无济于事,因为它的执行范围是Spring Cloud的EnvironmentManager。
我找到了解决我问题的方法。这里有很好的解释:
https://github.com/spring-projects/spring-boot/issues/7174
基本上,如果您运行一堆测试,一旦其中一个开始,如果它使用批注@MockBean,它将强制Spring重新加载上下文。
奖励:如果您的测试使用org.mockito.Mock,您将看到相同的行为。
| 归档时间: |
|
| 查看次数: |
11887 次 |
| 最近记录: |