Junit for JiraRestClient创建问题

时间:2014-11-19 10:57:30

标签: junit mockito junit4

我正在尝试为以下方法编写JUnit测试,该方法会创建一个新的Jira问题,有人知道如何模拟JiraRestClient,还是有其他方法可以为此编写测试

我的代码是

public Issue createNewIssue(BasicProject project, BasicUser assignee, BasicIssueType issueType, String summary, String description, String parentKey, File attachment)
 {
    try
    {
      IssueInputBuilder issueBuilder = new IssueInputBuilder(project, issueType);
      issueBuilder.setDescription(description);
      issueBuilder.setSummary(summary);
      issueBuilder.setProjectKey(project.getKey());
      issueBuilder.setIssueType(issueType);
      issueBuilder.setAssignee(assignee);
      if(parentKey != null)
      {
        Map<String, Object> parent = new HashMap<String, Object>();
        parent.put("key", parentKey);
        FieldInput parentField = new FieldInput("parent", new ComplexIssueInputFieldValue(parent));
        issueBuilder.setFieldInput(parentField);
      }
      IssueInput issueInput  = issueBuilder.build();

      IssueRestClient issueClient = getJiraRestClient().getIssueClient();
      BasicIssue newBasicIssue = issueClient.createIssue(issueInput, pm);
      Issue newIssue = issueClient.getIssue(newBasicIssue.getKey(), pm);
      if(attachment != null && newIssue != null)
        issueClient.addAttachments(pm, newIssue.getAttachmentsUri(), attachment); 
      return newIssue;
    } 
    catch (RestClientException e)
    {
      LOGGER.debug("Error while creating new Jira issue for input paramenters project : " + (project != null ? project.getName() : null) + " assignee : " +(assignee != null ? assignee.getName() : null)
          + " issueType : " + (issueType != null ? issueType.getName() : null) + " summary : " + summary + " description : " + description);
      return null;
    }
  }

更新

我想到的一件事是传递一个参数来决定方法是否从测试运行但是它会干扰我不想要的API。但要编写测试我必须要逃避调用

BasicIssue newBasicIssue = issueClient.createIssue(issueInput, pm);

怎么做?

2 个答案:

答案 0 :(得分:0)

在您的代码中,您获得了getJiraRestClient()方法。如果您也有setJiraRestClient(JiraRestClient client)方法,则可以从测试类中调用该方法并将其设置为模拟客户端。

在Mockito中你可以像这样初始化你的模拟客户端:

JiraRestClient mockClient = org.mockito.Mockito.mock(JiraRestClient.class);

假设您的Jira ReST客户端位于名为JiraRestClient的类中,当然。但是,您可以设置模拟以在调用IssueRestClient时返回模拟getIssueClient()等等。所以,像这样:

IssueRestClient mockIssueClient = org.mockito.Mockito.mock(IssueRestClient.class);
org.mockito.Mockito.when(mockClient.getIssueClient()).thenReturn(mockIssueClient);

等等。

如果您没有并且不想创建setJiraRestClient方法,但您将客户端作为课程中的字段,则可以使用BeanInject库将mock bean注入你的类:

Inject.field("field").of(target).with("value");

如果你正在使用Spring,你可以为你的单元测试创​​建一个不同的上下文文件,并让Spring注入一个模拟bean而不是真正的JiraRestClient bean。

答案 1 :(得分:0)

好。由于我没有直接使用JIRA Open API。相反,我使用JIRA Client来自动执行与JIRA相关的任务。

为了编写JIRA的单元测试,您需要在实现JIRA通用方法的地方模拟函数。例如,如果您希望获得特定缺陷/故障单的附件列表,则您的方法应类似于:

public class Generics {

private JiraClient jira;

    @Step("Get added attchments against issue <issueId>")
    public List<Attachment> getAttachments(String issueId) {
        List<Attachment> listOfAttachments = null;
        try {
            Issue issue = jira.getIssue(issueId);
            listOfAttachments = issue.getAttachments();
            LOGGER.info("Current Attachments to " + issueId + " " + listOfAttachments);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return listOfAttachments;
    }
}

等效的JUnit测试:

public class JiraUnitTests {

    @Mock
    List<Attachment> attachments;

    @Test
    public void testGetAttachment() {
        Generics generics = Mockito.mock(Generics.class);
        Mockito.when(generics.getAttachments(Matchers.any(String.class))).thenReturn(attachments);
        Assert.assertEquals(attachments, generics.getAttachments(Matchers.any(String.class)));
    }

我嘲笑了泛型类的以下数据成员:

  1. 各种附件
  2. 方法getAttachments()

在这里,您实际上并不需要模拟JIRA Client。相反,您可以模拟方法(如果您尚未修改核心业务逻辑/该方法的目的)