+2 امتیاز
قبل در برنامه نویسی توسط (1.4هزار امتیاز)
برچسب گذاری دوباره قبل توسط

یک bean دارم که داخلش یک bean (که interface هست) inject شده. چطوری می‌تونم بدون initialize کردن spring کلاس مورد نظرم رو به کمک jmockit تست کنم (bean ای که inject شده dependencyهای زیادی داره و تقریبا تمام beanهام رو شامل میشه و تست رو زمان‌بر می‌کنه).

کلاس تحت تست:

@Named
public class AttachmentCreateAuthorizer extends AbstractSingleRestAuthorizer {

	@Inject
	@Qualifier("taskInvolvementManagerFactory")
	protected ITaskInvolvementManager taskInvolvementManager;

	
	private static final String REQUEST_URL_REGEX = "/activiti/rest-api/attachments/\\d+";

	@Override
	protected boolean doAuthorize(ActivitiRestRequest request) {
		String taskId = request.getLastPathParam();
		return Permission.isCurrentUserHas(Permission.TaskAttachmentCreate)
				&& taskInvolvementManager.isCurrentUserAssigneeOfTask(taskId, false);
	}

	@Override
	protected String getRequestUrlRegex() {
		return REQUEST_URL_REGEX;
	}

	@Override
	protected HttpMethod getRequestMethod() {
		return HttpMethod.POST;
	}

	@Override
	protected boolean readRequestContent() {
		return false;
	}
}

تست با استفاده از spring:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class AttachmentCreateAuthorizerTest {
	
	@Inject
	AttachmentCreateAuthorizer authorizer;

	@Test
	public void doAuthorizeTest1() {
		new MockUp<Permission>() {
			@Mock
			public boolean isCurrentUserHas(Permission permission) {
				assertEquals(Permission.TaskAttachmentCreate,permission);
				return true;
			}
		};

		new MockUp<TaskInvolvementManager>() {
			@Mock
			public boolean isCurrentUserAssigneeOfTask(String taskId, boolean history) {
				assertFalse(history);
				assertEquals("1234", taskId);
				return true;
			}
		};

		ActivitiRestRequest request = new ActivitiRestRequest();
		request.setPathParamInfo("/attachments/1234");
		
		assertTrue(authorizer.doAuthorize(request));
	}
}

 

1 پاسخ

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

با استفاده از دو annotation زیر میشه مشکل رو برطرف کرد (به کلاس داخل Runwith نیز توجه شود):

  • mockit.Tested: روی bean تحت آزمون
  • mockit.Injectable: روی beanای که inject شده

به کاربرد کلاس mockit.Expectations هم باید توجه داشت که زنجیره‌ای از انتظارات از فراخوانی beanهای inject شده رو میشه در اون تعریف کرد. در مثال زیر (که معادل تست مطرح شده در سوال است) انتظار این است که متد isCurrentUserAssigneeOfTask از taskInvolvementManager یک بار با پارامترهای مشخص شده فراخوانی شود و مقدار true را برگرداند.

@RunWith(JMockit.class)
public class AttachmentCreateAuthorizerTest {
	
	@mockit.Tested
	AttachmentCreateAuthorizer authorizer;
	
	@mockit.Injectable
	private ITaskInvolvementManager taskInvolvementManager;

	/**
	 * has TaskAttachmentCreate permission, and is assignee of task
	 */
	@Test
	public void doAuthorizeTest1() {
		new MockUp<Permission>() {
			@Mock
			public boolean isCurrentUserHas(Permission permission) {
				assertEquals(Permission.TaskAttachmentCreate,permission);
				return true;
			}
		};

		new mockit.Expectations() {
			{
				taskInvolvementManager.isCurrentUserAssigneeOfTask(withEqual("1234"), withEqual(false));
				result = true;
				times = 1;
			}
		};
		
		ActivitiRestRequest request = new ActivitiRestRequest();
		request.setPathParamInfo("/attachments/1234");
		
		assertTrue(authorizer.doAuthorize(request));
	}

}

 

سوالات مشابه

+1 امتیاز
1 پاسخ 458 بازدید
+1 امتیاز
1 پاسخ 394 بازدید
0 امتیاز
1 پاسخ 315 بازدید
+1 امتیاز
1 پاسخ 558 بازدید
+1 امتیاز
1 پاسخ 808 بازدید
+1 امتیاز
1 پاسخ 624 بازدید
+2 امتیاز
2 پاسخ 384 بازدید
+1 امتیاز
1 پاسخ 535 بازدید
+1 امتیاز
1 پاسخ 426 بازدید
+1 امتیاز
0 پاسخ 937 بازدید
سوال شده 11 سال قبل در برنامه نویسی توسط Saeed Zarinfam (1.1هزار امتیاز)
...