متدی اصلی که میخواهم تست کنم (متد buildPart)، متد دیگری (متد findRecentTask) از همان کلاس رو فراخوانی میکنه که به نمیخواهم درگیر تست اون متد شوم. چگونه میتوان قسمتی از کلاس تحت آزمون (متد findRecentTask) رو به وسیله jmockit ماک کرد.
@Named
public class HistoryCriterionPostQueryBuilder implements PostQueryBuilder {
// injected fields
@Override
public PostQuery buildPart(PostQuery postQuery, AssignmentCriterion assignmentCriterion) {
DelegateExecution execution = assignmentCriterion.getExecution();
AssignmentAtomicCriterionValue value = assignmentCriterion.getValue();
if (Boolean.TRUE.equals(assignmentCriterion.getRecentTask())) {
HistoricTaskInstance task = findRecentTask(execution, value.getCode());
// implementation
} else {
// implementation
}
return postQuery;
}
HistoricTaskInstance findRecentTask(DelegateExecution execution, String taskDefinitionKey) {
HistoricTaskInstance task = null;
String executionId = execution.getId();
while(task == null && executionId != null) {
List<HistoricTaskInstance> tasks = historyService.createHistoricTaskInstanceQuery()
.executionId(executionId)
.taskDefinitionKey(taskDefinitionKey)
.taskAssigneeLike(postPrefix + "%")
.orderByTaskCreateTime()
.desc()
.list();
if (CollectionUtils.isEmpty(tasks)) {
executionId = getParentExecutionId(executionId);
} else {
task = tasks.get(0); // last created (recent) task
}
}
return task;
}
}
test case مورد نظر:
@RunWith(JMockit.class)
public class HistoryCriterionPostQueryBuilderTest {
@Tested
HistoryCriterionPostQueryBuilder postQueryBuilder;
// injectable fields
@Test
public void buildPartWithRecentTaskTest() {
//TODO mock findRecentTask??
PostQuery postQuery = new PostQuery();
AssignmentCriterion assignmentCriterion = createCriterion("1234", true);
postQuery = postQueryBuilder.buildPart(postQuery, assignmentCriterion);
assertEquals(1, postQuery.getCriteria().getCriteria().length);
assertEquals(Operand.EQUAL, postQuery.getCriteria().getCriteria()[0].getOperand());
assertEquals("id", postQuery.getCriteria().getCriteria()[0].getPropertyName());
assertEquals("3344", postQuery.getCriteria().getCriteria()[0].getValue());
}
private static AssignmentCriterion createCriterion(final String executionId, final boolean recentTask) {
// implementation
}
private static HistoricTaskInstance[] createTask(final String... assignees) {
// implementation
}
}
-
میخواهم مقدار بازگشتی متد ماک شده برابر مقدار زیر باشد:
createTask("post:3344")[0];
-
پارامتر اول پاس شده به آن از نوع DelegateExecution و پارامتر دوم برابر با رشته ConfirmTask باشد