如何在没有网络的情况下创建嵌入进程内/内存中的Hazelcast实例?
在我的unit testing中,我想创建一个嵌入式(进程内/内存中)Hazelcast实例,它根本不会尝试启动或执行任何网络操作。
我该怎么做呢?
例如:
Config config = new Config(); // what goes here? HazelcastInstance inProcessOnly = Hazelcast.newHazelcastInstance(config);
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也在内部使用它进行unit testing。 您需要为它添加此Maven依赖项:
com.hazelcast hazelcast ${hazelcast.version} tests test
有关如何使用的示例,请参阅BasicCacheTest 。
回答我自己的问题:
看来这是不可能的,但是我在下面提到的unit testing目的有一个很好的解决方案。 看看Hazelcast的源代码,网络代码似乎是在Node构建时自动执行的,并且没有任何Config操作对我有用。 如果可能的话,我很乐意以其他方式展示。
无论如何,我能够完成unit testing所需的工作:
作为EasyMock的长期用户,我不知道如何干净地测试调用Hazelcast.newHazelcastInstance(config);
的代码Hazelcast.newHazelcastInstance(config);
因为这是一个静态方法调用。 这实际上是促使我提出这个问题的原因 – 我只想要一个仅在内存中的Hazelcast实例进行测试。 我不希望在我们的受限构建机器上尝试网络操作 – 我不知道机器是否受到足够的限制,以至于Hazelcast的发现逻辑可能会使构建失败。
然后我找到了PowerMock对EasyMock的扩展,允许我模拟静态方法调用。
使用EasyMock和PowerMock,我能够在项目中完全对所有与Hazelcast相关的代码进行unit testing,而无需实际启动Hazelcast环境。
我能够和Mockito做同样的事情 。 例如,使用主题 :
HazelcastInstance hazelcastInstance = Mockito.mock(HazelcastInstance.class); Mockito.when(hazelcastInstance.getTopic("yourtopic")).thenReturn(Mockito.mock(ITopic.class));
您可以在内存中创建而不像这样模拟:
HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance();
你的构造函数中的其他参数你可以使用mock,这样你的代码就可以运行良好。
您可以使用HazelcastTestInstance,如下所述: https ://jukusoft.com/2017/01/11/java-hazelcast-junit-tests/
(链接是德语,但代码是Java)