私の単体テストでは、ネットワーク操作をまったく開始または実行しようとしない組み込み(インプロセス/インメモリ)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によって内部的にも使用されます。この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();
コンストラクター内の他のパラメーターをモックで使用できます。これにより、コードが適切に機能します。
You can use HazelcastTestInstance, as described here: https://jukusoft.com/2017/01/11/java-hazelcast-junit-tests/
(Link is German, but code is Java)