یک 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));
}
}