最近、就職面接のコーディング演習の 1 つを完了する必要がありました。基本的に、次のようなメッセージ キュー クラスを実装する必要がありました。
- 受信メッセージの優先度フィールドに基づいてアイテムを維持します。
- メッセージは、message.priorityField 値の範囲によって制御される、高、中、低の 3 つの優先度カテゴリのいずれかになります。
- getSize および isEmpty メソッドがあります。
- place(message) メソッドがあります。
- remove メソッドがあります。
- getFront() メソッドがあります (最も優先度の高いメッセージを返します)
あまり詳しく説明せずに最後に行ったことは、メッセージを保持するために ConcurrentSkipListMap (並行して順序付けられたマップ) を内部的に使用する MessageQueue クラスを実装することです。
また、基本的なビジネス要件をテストする基本的な JUnit テスト ケースも実装しました。
これはメッセージング キューであり、メッセージが同時に着信する可能性があるため、もちろん、実装のオカレンスの側面をテストする必要があります。
私は今、質問の核心に近づいています。
私の考えでは、基本的な JUnit テスト ケースでは、単一のスレッドが実装と対話しているときにコードが機能することを確認する必要があります。
次に、実装の発生する側面を検証する必要がある並行テスト ケースを実装しました。
ここで質問があります。どのような並行側面をテストする必要がありますか?
私が考えることができる唯一のことは、キューにメソッドを注入する複数のプロデューサースレッドと、メッセージを削除する複数のコンシューマースレッド ( getFront() を介して) を持つことです。ここで検証されているのは、キューに入ったメッセージは最終的に出てくるということです。
しかし、それで十分ですか?ここでテストできる他の同時の側面は何ですか?
また、私はすでに解決策を提出しているため、あなたが提案したことが、私が応募したこの仕事の可能性に影響を与えることはありません.