+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 پاسخ 334 بازدید
+1 امتیاز
1 پاسخ 264 بازدید
0 امتیاز
1 پاسخ 213 بازدید
+1 امتیاز
1 پاسخ 448 بازدید
+1 امتیاز
1 پاسخ 563 بازدید
+1 امتیاز
1 پاسخ 425 بازدید
+2 امتیاز
2 پاسخ 261 بازدید
+1 امتیاز
1 پاسخ 392 بازدید
+1 امتیاز
1 پاسخ 318 بازدید
+1 امتیاز
0 پاسخ 807 بازدید
سوال شده 10 سال قبل در برنامه نویسی توسط Saeed Zarinfam (1.1هزار امتیاز)
...