我为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();
}
}
目前,由于fedmsgEventListener
和PullRequestEvent
都是模拟对象且值为空,因此该方法会抛出NullPointerException
。
这是测试该场景的最佳方法吗?从高层次上看,我想要做的就是触发事件,查看主题是否更改为包含特定字符串的字符串。