Как создать экземпляр Hazelcast, встроенный в процесс / в память, без создания сети?
в моих модульных тестах я хочу создать встроенный (в процессе/в памяти) экземпляр Hazelcast, который не пытается запускать или выполнять какие-либо сетевые операции вообще.
Как это сделать?
например:
Config config = new Config();
// what goes here?
HazelcastInstance inProcessOnly = Hazelcast.newHazelcastInstance(config);
6 ответов
FWIW я создал тест в Hazelcast 3.6.1 и программно отключил сетевой кластер, используя следующий код в конструкторе. Это создает автономной сервер для тестирования.
Это не так быстро, как использование макета, но это быстрее, чем принятие конфигурации по умолчанию.
Config config = new Config();
config.setProperty("hazelcast.shutdownhook.enabled", "false");
NetworkConfig network = config.getNetworkConfig();
network.getJoin().getTcpIpConfig().setEnabled(false);
network.getJoin().getMulticastConfig().setEnabled(false);
HazelcastInstance instance = Hazelcast.newHazelcastInstance(config);
вы также можете использовать TestHazelcastInstanceFactory, который также используется Hazelcast внутренне для модульных тестов. Вам нужно будет добавить эту зависимость Maven для нее:
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast</artifactId>
<version>${hazelcast.version}</version>
<classifier>tests</classifier>
<scope>test</scope>
</dependency>
посмотреть BasicCacheTest для примера того, как он используется.
отвечая на мой собственный вопрос:
Кажется, что это невозможно, но есть хорошее решение для целей модульного тестирования, о котором я упоминаю ниже. Глядя на исходный код Hazelcast, кажется, что сетевой код автоматически выполняется при построении узла, и никакие манипуляции с конфигурацией не работали для меня. Я бы хотел, чтобы мне показали обратное, если это возможно.
в любом случае, я смог выполнить то, что мне нужно для модульного тестирования:
Как долгое время пользователь EasyMock, я не знал, как чисто проверить код, который вызвал Hazelcast.newHazelcastInstance(config);
Так как это был вызов статического метода. Это на самом деле то, что побудило меня задать этот вопрос - я просто хотел экземпляр Hazelcast только в памяти для тестирования. Я не хотел, чтобы сетевые операции предпринимались на нашей ограниченной машине сборки - я не знал, была ли машина достаточно ограничена, чтобы логика обнаружения Hazelcast могла провалить сборку.
затем я нашел PowerMockрасширение EasyMock, позволяющее мне издеваться над вызовами статических методов.
С EasyMock и PowerMock я смог полностью протестировать весь код, связанный с Hazelcast, в нашем проекте без фактического запуска среды Hazelcast.
вы можете создавать в памяти без макета, как это:
HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance();
другие параметры в конструкторе вы можете использовать макет, таким образом, ваш код будет работать хорошо.
вы можете использовать HazelcastTestInstance, как описано здесь: https://jukusoft.com/2017/01/11/java-hazelcast-junit-tests/
(ссылка немецкая, но код Java)