4

優れたアプリケーション設計について 2 つの質問をさせてください。

  1. e4 RCP アプリケーションでイベント ベースの通信を使用するためのベスト プラクティスは何ですか?
  2. 依存性注入と IEventBroker を使用してイベントを送受信するクラスの単純な単体テスト (JUnit を使用) を作成するにはどうすればよいですか?

もっと具体的に言ってみましょう。通信が必要ないくつかのプラグインで構成される Eclipse e4 RCP アプリケーションを開発しているとします。通信には、org.eclipse.e4.core.services.events.IEventBroker が提供するイベント サービスを使用して、プラグインを疎結合のままにしたいと考えています。依存性注入を使用して、イベント ブローカーをイベントをディスパッチするクラスに注入します。

@Inject static IEventBroker broker; 
private void sendEvent() {
broker.post(MyEventConstants.SOME_EVENT, payload)
}

受信側では、次のようなメソッドがあります。

@Inject
@Optional
private void receiveEvent(@UIEventTopic(MyEventConstants.SOME_EVENT) Object payload) 

今質問:

  1. IEventBroker を正常に注入するには、クラスが現在の IEclipseContext にアクセスする必要があります。イベント サービスを使用する私のクラスのほとんどは e4 アプリケーション モデルによって参照されないため、たとえば、インスタンス化の際にコンテキストを手動で注入する必要がContextInjectionFactory.inject(myEventSendingObject, context); あります。これは、E4 アプリケーション全体でイベント ベースの通信を行うための正しいアプローチですか?

  2. イベント サービスを (送信側または受信側として) 使用するクラスの JUnit テストを簡単に作成するにはどうすればよいですか? 明らかに、利用可能なコンテキストがないため、上記の注釈はどれも単独では機能しません。依存性注入がテスト容易性を簡素化すると誰もが確信していることを理解しています。しかし、これは IEventBroker のような注入サービスにも当てはまるのでしょうか?

この記事では、テストに DI のプロセスを含めるための独自の IEclipseContext の作成について説明します。これで 2 番目の問題が解決するかどうかはわかりませんが、単体テストごとに PDE を起動するのは現実的ではないように見えるため、すべてのテストを JUnit プラグイン テストとして実行することもためらっています。多分私はアプローチを誤解しています。

この記事では、「単純に IEventBroker をモックする」ことについて説明します。はい、それは素晴らしいことです!残念ながら、これを実現する方法に関する情報は見つかりませんでした。

これはすべて、私がまだ正しい軌道に乗っているのか、それともこれはすでに悪い設計のケースなのか疑問に思っています。もしそうなら、どのように再設計しますか?すべてのイベント関連のアクションを専用のイベント センダー/レシーバー クラスまたは専用プラグインに移動しますか?

4

2 に答える 2