2016-07-22 49 views
1

我使用@PreAuthorize保护Web请求我如何注入嘲笑到春天的安全等级

@PreAuthorize("(@assessmentAuthService.canViewAssessment(#id))") 

AssessmentAuthService被弹簧自动创建的,但我需要从我的单元测试注入模拟对象进去。

private final AssessmentService assessmentService; 

@Inject 
public AssessmentAuthorizationServiceImpl(AssessmentService assessmentService) { 
    this.assessmentService = assessmentService; 
} 

这是因为我想要assessmentService.getById(assessmentId)返回一个模拟对象。 我已经尝试过这个设定,但它不工作:

ReflectionTestUtils.setField(assessmentAuthorizationService, 
          "assessmentService", mockAssessmentService); 
+0

你的单元测试是怎样的? – dunni

+0

这对于像mockito这样的事情来说已经足够简单了。你使用了什么模拟框架?迄今为止你尝试过了什么? –

回答

0

我试图注入模拟成AssessmentAuthorizationService与ReflectionTestUtils.setField,但我没有意识到的Spring Bean代理。在设置字段之前,我必须使用此方法来解包代理。

class TestUtils { 

    ... 

public static Object unwrapService(Object service) throws Exception { 
    final boolean aopProxy = AopUtils.isAopProxy(service); 
    final boolean instanceCheck = service instanceof Advised; 
    if (aopProxy && instanceCheck) { 
    Object target = ((Advised) service).getTargetSource().getTarget(); 
    return target; 
    } 
return null; 
} 
} 

之后我做了它的工作。我可以将该领域设置为模拟并定义我想要的行为。

ReflectionTestUtils.setField(TestUtil.unwrapService(assessmentAuthorizationService), 
          "assessmentService", mockAssessmentService); 
when(mockAssessmentService.getById(eq(2L))).thenReturn(Optional.of(assessment));