イベントハンドラーをモックするにはどうすればよいですか?

スコットジェームスウォルター

メッセージングバスアーキテクチャを介してメッセージを送信するために、Stashのイベントハンドラーを作成しました。これが私のfedmsgEventListenerクラスの例です

@EventListener
public void opened(PullRequestOpenedEvent event)
{
    HashMap<String, Object> message = prExtracter(event);
    String originProjectKey = ((HashMap<String, Object>)message.get("source")).get("project_key").toString();
    String originRepo = ((HashMap<String, Object>)message.get("source")).get("repository").toString();
    String topic = originProjectKey + "." + originRepo + ".pullrequest.opened";
    sendMessage(topic, message);
}

イベントを取得し、そこから情報を抽出し、イベント内の情報に基づいてトピックを作成し、メッセージを送信するメソッドを呼び出します。これらすべてのイベントハンドラーの単体テストを作成する必要があります。

これが、私が実装しようとしている最初のテストを実行するクラスです。

import org.junit.Test;
import com.cray.stash.MyPluginComponent;
import com.cray.stash.MyPluginComponentImpl;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

public class MyComponentUnitTest
{
    @Test
    public void testMyName()
    {
        MyPluginComponent component = new MyPluginComponentImpl(null);       
        assertTrue(component.openPullRequest().contains(".pullrequest.opened"));
    }
}

次に、テストが呼び出すクラスとメソッドを示します。

import com.atlassian.sal.api.ApplicationProperties;
import com.atlassian.stash.event.pull.*;
import org.mockito.Mock;
import static org.mockito.Mockito.*;

public class MyPluginComponentImpl implements MyPluginComponent
{
    @Mock private PullRequestEvent event;
    @Mock private PullRequestOpenedEvent opened;
    @Mock private FedmsgEventListener fedmsgEventListener;

    public MyPluginComponentImpl(ApplicationProperties applicationProperties)
    {
        this.applicationProperties = applicationProperties;
    }

    public String openPullRequest()
    {
        fedmsgEventListener.opened(opened);
        return fedmsgEventListener.getTopic();
    }

}

現在のところ、は両方ともモックオブジェクトであり、したがってnullであるNullPointerExceptionため、メソッドはaをスローします。fedmsgEventListenerPullRequestEvent

これは、このシナリオの単体テストを行うための最良の方法ですか?大まかに言うと、これが私がやりたいことのすべてです。イベントをトリガーし、トピックが特定の文字列を含む文字列に変更されたことを確認します。

durron597

あなたはMockitoを完全に間違って使用しています。ごめんなさい。まず、または@Mockを使用しないと機能しませんが、とにかくそのようにはしません。モックはnullではありません; モックのメソッドを呼び出すことができるはずです。あなたの場合、モックを初期化/作成しなかったので、モックはnullでした。initMocksMockitoJUnitRunner

まず、テストしようとしているクラスを特定します。ここにあるようFedmsgEventListenerです。次に、依存関係などを持つ実際のオブジェクトの代わりに、モックオブジェクトとデータ構造を使用して、そのクラスの実際のインスタンスと対話します。ここではHamcrest1.3を使用していることに注意してください

モックベースのテストは、次の3つのフェーズで構成されます。

  1. 作成-モックを作成し、そのモックとの相互作用が「発生したとき」に何かを行うことを述べます。
  2. 相互作用-テストしようとしている方法でオブジェクトと相互作用します。
  3. 確認してください-利用Mockito.verifyとJUnit / Hamcrestのassert方法は、物事はあなたが期待される道を働いていることを確認します。

あなたはこのようなことをするかもしれません:

import static org.mockito.Mockito.*;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;

private HashMap<String, Object> createMessageDetails(String project_key, String repository) {
  HashMap<String, Object> details = new HashMap<>();
  details.put("project_key", project_key);
  details.put("repository", repository);
  return details;
}

public class FedmsgEventListenerTest {
  @Test
  public void testOpened() {
    // when
    PullRequestOpenedEvent event = mock(PullRequestOpenedEvent.class);
    when(event.someMethodForPrExtracterYouHaventShownMe()).thenReturn(createMessageDetails("myKey", "myRepo"));

    // then
    FedmsgEventListener listener = new FedmsgEventListener();
    listener.opened(event);

    // verify
    assertThat(event.getTopic(), containsString(".pullrequest.opened"));
    verify(event).someMethodForPrExtracterYouHaventShownMe();
  }
}

このコードはおそらくあなたが必要としているものとは正確には一致しませんが、正確に正しく取得するためにテストしようとしているコードを十分に示していません。ただし、これで十分に始めることができると思います。


余談ですが依存関係をモックしたクラスの実際のインスタンス作成できない場合、それはコードの臭いであり、コードをリファクタリングする必要があります。これが、静的が非常に悪い考えである理由の1つです。コードが静的を介してグローバル状態にアクセスしている場合は、静的を使用してグローバル状態を設定する必要があるためです。クラスがモック依存関係を処理できるようにし、それらを引数としてコンストラクターに渡し、でモック動作を指定してからwhen、結果をアサート/検証します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

jqueryイベントハンドラーでmvcモデルを動的にフェッチするにはどうすればよいですか?

分類Dev

@ContentChildrentからイベントハンドラーを取得するにはどうすればよいですか?

分類Dev

@ContentChildrentからイベントハンドラーを取得するにはどうすればよいですか?

分類Dev

クラスメソッドをイベントハンドラーとして設定するにはどうすればよいですか?

分類Dev

ブートストラップdatepickerでイベントハンドラーのバインドを解除するにはどうすればよいですか?

分類Dev

イベントハンドラーを使用してボックスシャドウの色を操作するにはどうすればよいですか?

分類Dev

カスタムテキストボックスからイベントハンドラーを使用するにはどうすればよいですか?

分類Dev

Minecraft Forgeのブロックレバーにイベントハンドラーを追加するにはどうすればよいですか?

分類Dev

djangoシグナルハンドラーをモックするにはどうすればよいですか?

分類Dev

djangoシグナルハンドラーをモックするにはどうすればよいですか?

分類Dev

スペースキーをリッスンするキーイベントハンドラーを追加するにはどうすればよいですか?

分類Dev

git addインタラクティブパッチモードでより良いハンクを取得するにはどうすればよいですか?

分類Dev

別のハンドラーからangularjsイベントハンドラーをトリガーするにはどうすればよいですか?

分類Dev

アクションハンドラーで元のイベントオブジェクトを取得するにはどうすればよいですか?

分類Dev

ハンドラー内のトルネードハンドラーをベンチマークするにはどうすればよいですか?

分類Dev

jQueryで他のクリックイベントハンドラーを防ぐことができるイベントハンドラーを追加するにはどうすればよいですか?

分類Dev

派生抽象クラス内でイベントハンドラーを追加および削除するにはどうすればよいですか?

分類Dev

VertxイベントループスレッドでCompletableFutureハンドラーを実行するにはどうすればよいですか?

分類Dev

VB6で(イベントハンドラーではなく)ハンドルを作成するにはどうすればよいですか?

分類Dev

Xpathのjavascriptイベントハンドラーからリンクを取得するにはどうすればよいですか?

分類Dev

Fabric.jsサブクラスでイベントハンドラーを定義するにはどうすればよいですか?

分類Dev

このイベントハンドラーをjQueryプラグインにバインドするにはどうすればよいですか?

分類Dev

放出されたイベントに非同期イベントハンドラーを使用するにはどうすればよいですか?

分類Dev

wxPythonイベントハンドラーでShiftキーが押されたかどうかを確認するにはどうすればよいですか?

分類Dev

複数のタブクローズイベントハンドラーをJavaFXタブに追加するにはどうすればよいですか?

分類Dev

Cocoaスクリプティング:AppleScriptハンドラー(イベント)を使用するにはどうすればよいですか?

分類Dev

C#で動的ラベルを編集するためのイベントハンドラーを作成するにはどうすればよいですか?

分類Dev

ナビゲーターハンドルをプログラムでハイストックに設定するにはどうすればよいですか?

分類Dev

Javascriptイベントハンドラーを最初に実行するようにするにはどうすればよいですか?

Related 関連記事

  1. 1

    jqueryイベントハンドラーでmvcモデルを動的にフェッチするにはどうすればよいですか?

  2. 2

    @ContentChildrentからイベントハンドラーを取得するにはどうすればよいですか?

  3. 3

    @ContentChildrentからイベントハンドラーを取得するにはどうすればよいですか?

  4. 4

    クラスメソッドをイベントハンドラーとして設定するにはどうすればよいですか?

  5. 5

    ブートストラップdatepickerでイベントハンドラーのバインドを解除するにはどうすればよいですか?

  6. 6

    イベントハンドラーを使用してボックスシャドウの色を操作するにはどうすればよいですか?

  7. 7

    カスタムテキストボックスからイベントハンドラーを使用するにはどうすればよいですか?

  8. 8

    Minecraft Forgeのブロックレバーにイベントハンドラーを追加するにはどうすればよいですか?

  9. 9

    djangoシグナルハンドラーをモックするにはどうすればよいですか?

  10. 10

    djangoシグナルハンドラーをモックするにはどうすればよいですか?

  11. 11

    スペースキーをリッスンするキーイベントハンドラーを追加するにはどうすればよいですか?

  12. 12

    git addインタラクティブパッチモードでより良いハンクを取得するにはどうすればよいですか?

  13. 13

    別のハンドラーからangularjsイベントハンドラーをトリガーするにはどうすればよいですか?

  14. 14

    アクションハンドラーで元のイベントオブジェクトを取得するにはどうすればよいですか?

  15. 15

    ハンドラー内のトルネードハンドラーをベンチマークするにはどうすればよいですか?

  16. 16

    jQueryで他のクリックイベントハンドラーを防ぐことができるイベントハンドラーを追加するにはどうすればよいですか?

  17. 17

    派生抽象クラス内でイベントハンドラーを追加および削除するにはどうすればよいですか?

  18. 18

    VertxイベントループスレッドでCompletableFutureハンドラーを実行するにはどうすればよいですか?

  19. 19

    VB6で(イベントハンドラーではなく)ハンドルを作成するにはどうすればよいですか?

  20. 20

    Xpathのjavascriptイベントハンドラーからリンクを取得するにはどうすればよいですか?

  21. 21

    Fabric.jsサブクラスでイベントハンドラーを定義するにはどうすればよいですか?

  22. 22

    このイベントハンドラーをjQueryプラグインにバインドするにはどうすればよいですか?

  23. 23

    放出されたイベントに非同期イベントハンドラーを使用するにはどうすればよいですか?

  24. 24

    wxPythonイベントハンドラーでShiftキーが押されたかどうかを確認するにはどうすればよいですか?

  25. 25

    複数のタブクローズイベントハンドラーをJavaFXタブに追加するにはどうすればよいですか?

  26. 26

    Cocoaスクリプティング:AppleScriptハンドラー(イベント)を使用するにはどうすればよいですか?

  27. 27

    C#で動的ラベルを編集するためのイベントハンドラーを作成するにはどうすればよいですか?

  28. 28

    ナビゲーターハンドルをプログラムでハイストックに設定するにはどうすればよいですか?

  29. 29

    Javascriptイベントハンドラーを最初に実行するようにするにはどうすればよいですか?

ホットタグ

アーカイブ