Как создать экземпляр 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.


я смог сделать то же самое с Mockito. Например, с помощью темы:

HazelcastInstance hazelcastInstance = Mockito.mock(HazelcastInstance.class);
Mockito.when(hazelcastInstance.getTopic("yourtopic")).thenReturn(Mockito.mock(ITopic.class));

вы можете создавать в памяти без макета, как это:

HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance();

другие параметры в конструкторе вы можете использовать макет, таким образом, ваш код будет работать хорошо.


вы можете использовать HazelcastTestInstance, как описано здесь: https://jukusoft.com/2017/01/11/java-hazelcast-junit-tests/

(ссылка немецкая, но код Java)