如何在没有网络的情况下创建嵌入进程内/内存中的Hazelcast实例?

时间:2013-01-12 03:15:34

标签: java hazelcast

在我的单元测试中,我想创建一个嵌入式(进程内/内存中)Hazelcast实例,它根本不会尝试启动或执行任何网络操作。

我该怎么做?

例如:

Config config = new Config();

// what goes here?

HazelcastInstance inProcessOnly = Hazelcast.newHazelcastInstance(config);

6 个答案:

答案 0 :(得分: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);

答案 1 :(得分:5)

您也可以使用内部使用Hazelcast进行单元测试的TestHazelcastInstanceFactory。您需要为它添加此Maven依赖项:

<dependency>
  <groupId>com.hazelcast</groupId>
  <artifactId>hazelcast</artifactId>
  <version>${hazelcast.version}</version>
  <classifier>tests</classifier>
  <scope>test</scope>
</dependency>

有关如何使用的示例,请参阅BasicCacheTest

答案 2 :(得分:2)

回答我自己的问题:

似乎这是不可能的,但是我在下面提到的单元测试目的有一个很好的解决方案。看看Hazelcast的源代码,网络代码似乎是在Node构建时自动执行的,并且没有任何Config操作对我有用。如果可能的话,我希望能够以其他方式展示。

无论如何,我能够完成单元测试所需的工作:

作为EasyMock的长期用户,我不知道如何干净地测试调用Hazelcast.newHazelcastInstance(config);的代码,因为它是一个静态方法调用。这实际上是促使我提出这个问题的原因 - 我只想要一个仅用于内存的Hazelcast实例进行测试。我不希望在我们的受限构建机器上尝试网络操作 - 我不知道机器是否受到足够的限制,以至于Hazelcast的发现逻辑可能会使构建失败。

然后我找到了PowerMock对EasyMock的扩展,允许我模拟静态方法调用。

使用EasyMock和PowerMock,我能够在项目中完全对所有与Hazelcast相关的代码进行单元测试,而无需实际启动Hazelcast环境。

答案 3 :(得分:2)

我能够对Mockito做同样的事情。例如,使用Topic

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

答案 4 :(得分:0)

你可以在内存中创建,而不是像这样:

HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance();

你的构造函数中的其他参数你可以使用mock,这样你的代码就可以正常运行。

答案 5 :(得分:0)

您可以使用HazelcastTestInstance,如下所述: https://jukusoft.com/2017/01/11/java-hazelcast-junit-tests/

(链接是德语,但代码是Java)