2016-07-22 33 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));