java - 运行单元测试时 RmiRegistry 创建多次

标签 java unit-testing spring-boot rmi

我的 Spring Boot 应用程序有一个 bean:

@Configuration
public class JmxRmiConfig {
    @Value("${jmx.rmi.host:localhost}")
    private String rmiHost;
    @Value("${jmx.rmi.port:1099}")
    private Integer rmiPort;

    @Bean
    public RmiRegistryFactoryBean rmiRegistry() {
        final RmiRegistryFactoryBean rmiRegistryFactoryBean = new RmiRegistryFactoryBean();
        rmiRegistryFactoryBean.setPort(rmiPort);
        rmiRegistryFactoryBean.setAlwaysCreate(true);
        return rmiRegistryFactoryBean;
    }

    @Bean
    @DependsOn("rmiRegistry")
    public ConnectorServerFactoryBean connectorServerFactoryBean() throws Exception {
        final ConnectorServerFactoryBean connectorServerFactoryBean = new ConnectorServerFactoryBean();
        connectorServerFactoryBean.setObjectName("connector:name=rmi");
        connectorServerFactoryBean.setServiceUrl(String.format("service:jmx:rmi://%s:%s/jndi/rmi://%s:%s/jmxrmi", rmiHost, rmiPort, rmiHost, rmiPort));
        return connectorServerFactoryBean;
    }
}

我有两个单元测试,都注释如下:

@AutoConfigureMockMvc
@SpringBootTest
@Unroll
class ... extends Specification { ... }

(Unroll和Specification均来自spock.lang)

当我使用 maven/surefire 一起运行它们时,第二个测试类失败,并出现以下错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'rmiRegistry' defined in class path resource [uk/ac/prospects/hedd/api/config/JmxRmiConfig.class]: Invocation of init method failed; nested exception is java.rmi.server.ExportException: internal error: ObjID already in use

它似乎正在为第二个类重新创建 RmiRegistry,而不破坏第一个类。

由于我还有其他没有 @AutoConfigureMockMvc 的测试可以一起正常运行,因此我的假设是 @AutoConfigureMockMvc 触发了问题。

如何让两个测试一起运行?

最佳答案

surefire 插件的以下附加配置为我们解决了这个问题。

                <forkCount>1</forkCount>
                <reuseForks>false</reuseForks>

不能 100% 理解问题,但我们添加了上述内容,因为测试套件在一个测试中模拟但在另一测试中正确配置的 Spring bean 之间变得困惑。这也解决了 RMI bean 问题。我认为这为每个测试提供了一个干净的 Spring 上下文。

关于java - 运行单元测试时 RmiRegistry 创建多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53815303/

相关文章:

configuration - 使用Spring Boot和Thymeleaf加载静态资源

java - 开始学习 Android 开发的最佳方式?

java - 在 HQL 中查询标量集合

java - 全局 log4j2-test.xml 配置

c# - 当多个单元测试复制同一个文件时,运行所有单元测试失败

c# - 单元测试在 System.Net.Http v4 中使用 HttpClient 的类

具有多线程的 Java Swing

java - 此行在 Java : boolean retry = id == 1; 中是什么意思

spring-boot - java.lang.IllegalStateException : Unable to find a @SpringBootConfiguration, 你需要使用 @ContextConfiguration 或 @SpringBootTest(classes=...)

spring-boot - 带有数据 JPA 的 Spring Boot 多模块不起作用