+1 امتیاز
قبل در برنامه نویسی توسط (1.4هزار امتیاز)
ویرایش شده قبل توسط

متدی اصلی که میخو‌اهم تست کنم (متد 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 باشد

1 پاسخ

+2 امتیاز
قبل توسط (1.4هزار امتیاز)
انتخاب شده قبل توسط
 
بهترین پاسخ

هنگام new کردن دو کلاس mockit.NonStrictExpectations و mockit.Expectations می‌توان پارامترهایی را تعیین کرد که در واقع اشیایی هستند که بخشی از آن‌ها را می‌خواهیم ماک کنیم. بنابراین در ابتدای test case می‌توان تکه کد زیر رو قرار داد:

@Test
	public void buildPartWithRecentTaskTest() {
		new NonStrictExpectations(postQueryBuilder) {
			{
				postQueryBuilder.findRecentTask(withInstanceOf(DelegateExecution.class), withEqual("ConfirmTask"));
				result = createTask("post:3344")[0];
			}
		};
		// implementation
	}

اگر متد مورد نظر private بود می‌توان از invoke (از بسته‌ی import static mockit.Deencapsulation.invoke) استفاده کرد:

	@Test
	public void buildPartWithRecentTaskTest() {
		new NonStrictExpectations(postQueryBuilder) {
			{
				invoke(postQueryBuilder, "findRecentTask",withInstanceOf(DelegateExecution.class), withEqual("ConfirmTask"));
				result = createTask("post:3344")[0];
			}
		};
		// implementation
	}

 

سوالات مشابه

+2 امتیاز
1 پاسخ 429 بازدید
سوال شده 8 سال قبل در برنامه نویسی توسط mofarn (1.4هزار امتیاز)
+1 امتیاز
1 پاسخ 270 بازدید
0 امتیاز
1 پاسخ 216 بازدید
+1 امتیاز
1 پاسخ 396 بازدید
+2 امتیاز
2 پاسخ 265 بازدید
+1 امتیاز
1 پاسخ 320 بازدید
+1 امتیاز
0 پاسخ 811 بازدید
سوال شده 10 سال قبل در برنامه نویسی توسط Saeed Zarinfam (1.1هزار امتیاز)
0 امتیاز
0 پاسخ 197 بازدید
سوال شده 4 سال قبل در برنامه نویسی توسط farhad99 (0 امتیاز)
0 امتیاز
1 پاسخ 420 بازدید
...