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

时间:2018-12-17 12:30:11

标签: 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 { ... }

(展开和说明均来自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触发了问题。

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

我还没有测试过,但是认为Spring Test Framework批注@DirtiesContext可能是一种解决方案:https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#spring-testing-annotation-dirtiescontext