【问题标题】:RmiRegistry created multiple times when running unit testsRmiRegistry 在运行单元测试时创建了多次
【发布时间】:2018-12-17 12:30:11
【问题描述】:

我的 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: 错误 创建在类路径资源中定义的名称为“rmiRegistry”的bean [uk/ac/prospects/hedd/api/config/JmxRmiConfig.class]:调用 初始化方法失败;嵌套异常是 java.rmi.server.ExportException:内部错误:ObjID 已在使用中

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

由于我有其他没有@AutoConfigureMockMvc 的测试一起运行良好,我的假设是@AutoConfigureMockMvc 触发了问题。

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

【问题讨论】:

  • 我遇到了同样的问题,我发现没有提供任何解决方案。你有没有想过这个问题?
  • @EvanKairuz 是的,我们今天解决了这个问题,同时调查了作为一组测试运行时测试未通过的其他问题。看我的回答

标签: java unit-testing spring-boot rmi


【解决方案1】:

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

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

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

【讨论】:

  • 很好地解决了这个问题。不幸的是,我的团队已经放弃了 jmx 工作,但我确实测试了这个更改,发现现在 JMX 连接器服务器在每次测试时都会启动和停止。顺便说一句,这导致我们的测试花费了更长的时间,但非常感谢您发布您的解决方案。很酷。
【解决方案2】:

我没有对此进行测试,但认为可能有使用 Spring Test Framework 注释 @DirtiesContext 的解决方案:https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#spring-testing-annotation-dirtiescontext

【讨论】:

    猜你喜欢
    • 2020-10-14
    • 2011-11-04
    • 1970-01-01
    • 2019-12-10
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 2011-02-10
    相关资源
    最近更新 更多