我正在尝试为以下方法编写一个 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);
怎么做?
在你的代码中,你有一个getJiraRestClient()
的方法。如果您也有setJiraRestClient(JiraRestClient client)
方法,则可以从测试类中调用该方法并将其设置为模拟客户端。
在 Mockito 中,您可以像这样初始化您的模拟客户端:
JiraRestClient mockClient = org.mockito.Mockito.mock(JiraRestClient.class);
当然,这是假设您的 Jira ReST 客户端位于一个名为 JiraRestClient 的类中。但是,您可以设置模拟以在调用其getIssueClient()
时返回模拟IssueRestClient
,等等。所以,像这样:
IssueRestClient mockIssueClient = org.mockito.Mockito.mock(IssueRestClient.class);
org.mockito.Mockito.when(mockClient.getIssueClient()).thenReturn(mockIssueClient);
等等。
如果您没有也不想创建 setJiraRestClient
方法,但将客户端作为类中的一个字段,则可以使用 BeanInject 库将模拟 Bean 注入到类中:
Inject.field("field").of(target).with("value");
如果你使用的是 Spring,你可以为你的单元测试创建一个不同的上下文文件,并让 Spring 注入一个模拟 bean 而不是真正的 JiraRestClient bean。
好的。因为我没有直接使用过JIRA Open API。相反,我使用JIRA客户端来自动执行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)));
}
我在下面嘲笑了泛型类的数据成员:
- 可变附件
- 方法 getAttachments()
在这里,你真的不需要嘲笑JIRA客户端。相反,您可以模拟方法(如果您没有修改该方法的核心业务逻辑/目的)