メッセージングバスアーキテクチャを介してメッセージを送信するために、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をスローします。fedmsgEventListener
PullRequestEvent
これは、このシナリオの単体テストを行うための最良の方法ですか?大まかに言うと、これが私がやりたいことのすべてです。イベントをトリガーし、トピックが特定の文字列を含む文字列に変更されたことを確認します。
あなたはMockitoを完全に間違って使用しています。ごめんなさい。まず、または@Mock
を使用しないと機能しませんが、とにかくそのようにはしません。モックはnullではありません; モックのメソッドを呼び出すことができるはずです。あなたの場合、モックを初期化/作成しなかったので、モックはnullでした。initMocks
MockitoJUnitRunner
まず、テストしようとしているクラスを特定します。ここにあるようFedmsgEventListener
です。次に、依存関係などを持つ実際のオブジェクトの代わりに、モックオブジェクトとデータ構造を使用して、そのクラスの実際のインスタンスと対話します。ここではHamcrest1.3を使用していることに注意してください。
モックベースのテストは、次の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]
コメントを追加