2016-07-22 15 views
1

ich @PreAuthorize bin mit einem Web-AnfrageWie kann ich Mocks in den Frühling Sicherheitsklassen injizieren

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

AssessmentAuthService zu sichern automatisch durch die Feder erzeugt wird, aber ich brauche ein Mock-Objekt in es aus meiner Unit-Test zu injizieren .

private final AssessmentService assessmentService; 

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

Das ist, weil ich assessmentService.getById (assessmentId) will ein verspottete Objekt zurückzukehren. ich schon versucht, es mit dieser Einstellung, aber es funktioniert nicht:

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

Und wie sieht Ihr Komponententest aus? – dunni

+0

Das ist leichter genug mit etwas wie Mockito zu tun. Welchen spöttischen Rahmen benutzen Sie und was haben Sie bisher versucht? –

Antwort

0

ich ein Mock in AssessmentAuthorizationService mit ReflectionTestUtils.setField zu injizieren versuchte, aber ich wusste nicht, dass der Frühling Bohnen Proxies sind. Ich musste diese Methode verwenden, um den Proxy auszupacken, bevor ich das Feld setzte.

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; 
} 
} 

Nachdem ich das getan hat, hat es funktioniert. Ich könnte das Feld auf einen Schein stellen und das Verhalten definieren, das ich wollte.

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