RmiRegistry создается несколько раз при запуске модульных тестов - PullRequest
0 голосов
/ 17 декабря 2018

У моего приложения 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: Ошибка при создании bean-компонента с именем'rmiRegistry' определено в ресурсе пути к классу [uk / ac / progress / hedd / api / config / JmxRmiConfig.class]: сбой вызова метода init;Вложенное исключение - java.rmi.server.ExportException: внутренняя ошибка: ObjID уже используется

Похоже, он заново создает RmiRegistry для второго класса, не разрушая первый.

Поскольку у меня есть другие тесты без @AutoConfigureMockMvc, которые отлично работают вместе, моя гипотеза состоит в том, что @AutoConfigureMockMvc вызывает проблему.

Как мне заставить оба теста работать вместе?

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Я не проверял это, но думаю, что может быть решение с аннотацией Spring Test Framework @DirtiesContext: https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#spring-testing-annotation-dirtiescontext

0 голосов
/ 11 января 2019

Следующая дополнительная конфигурация к плагину surefire решила эту проблему для нас.

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

Не понимаю проблемы на 100%, но мы добавили вышеупомянутое, поскольку набор тестов запутался между бобами Springкоторые были проверены в одном тесте, но правильно настроены в другом тесте.Это также исправило проблему RMI-компонента.Я думаю, что это дает чистый контекст Spring для каждого теста.

...