2017-01-17 5 views
0

Ich benutze Mockito mit Groovy zu Unit-Test einige Rest Anrufe mit dem Groovy Rest-Client.Mockito: Mock groovy Rest Client Anruf

Wie kann ich den bpmApiRestClient.get-Aufruf in der updatePhase-Methode unten verspotten?

@Service 
public class PhasesBPMServiceImpl implements PhasesBPMService { 

    Logger logger = Logger.getLogger(PhasesBPMServiceImpl.class) 

    @Autowired 
    ObjectMapper objectMapper 

    @Autowired 
    BPMConfig bpmConfig 

    @Autowired 
    JsonSlurper jsonSlurper 

    @Autowired 
    GetMaintenanceActivitiesPhasesCurrentResponseTransformer getMaintenanceActivitiesPhasesCurrentResponseTransformer 

    @Autowired 
    PutMaintenanceActivityPhaseRequestTransformer putMaintenanceActivityPhaseRequestTransformer 

public void updatePhase(
    String loggedInUsernameEncoded, 
    String phaseDefinitionKey, 
    String activityId, 
    Reader reader) { 

    def bpmApiRestClient = new BpmRestClient(bpmConfig) 
    try { 
     def processInstancePhases = bpmApiRestClient.get path: 'task', query: [ processInstanceId: activityId ] 
    } catch (Exception e) { 
     e.printStackTrace() 
     logger.error "Error occurred while updating phase details. Error Message [${e?.message}]. Error Cause [${e?.cause}]" 
     throw e 
    } 
    finally { 
     bpmApiRestClient.shutdown() 
    } 
} 

Zu einem bestimmten Zeitpunkt hatte ich die Dinge gemäß dem Unit-Test unter Arbeits aber sobald ich bpmApiRestClient Refactoring innerhalb der Methode anstatt die spöttischen aufgehört zu arbeiten auf der Ebene der Klassen instanziiert werden.

class PhasesBPMServiceImplPutMaintenanceActivitiesByActivityIdPhasesNameTest { 

    def restClient, responseTransformer, objectMapper, jsonSlurper, bpmConfig 

    void init() { 
     restClient = Mockito.mock(RESTClient) 
     when(restClient.get(anyObject())).thenReturn([data: [ 
       [ // get current task for process id 
        id: "2", 
        name: "Waiting to be allocated", 
        assignee: "Cosmo Kramer", 
        created: "2016-11-16T15:10:29" 
       ] 
      ]]) 

     responseTransformer = new PutMaintenanceActivityPhaseRequestTransformer(responseBaseUrl: '/maintenance/activities') 
     objectMapper = new ObjectMapperConfig().getObjectMapper() 
     jsonSlurper = new JsonSlurper() 
     bpmConfig = new BPMConfig(maintenanceProcessName:'Maintenance_Activity_Process', 
     baseUrl:'http://localhost:12378/v1/camunda/rest/') 

    } 

    @Test 
    void testUpdatePhaseSuccess() { 
     // setup 
     init() 
     PhasesBPMServiceImpl service = 
       new PhasesBPMServiceImpl(bpmConfig: bpmConfig, 
       putMaintenanceActivityPhaseRequestTransformer: responseTransformer, 
       objectMapper: objectMapper, 
       jsonSlurper: new JsonSlurper()) 
     // invoke 
     try { 
      def request = getClass().getResourceAsStream('/in/putPhaseRequest.json').text 
      def response = service.updatePhase('rriviere', 'Unallocated', '7', new StringReader(request)) 
     } catch (Exception e) { 
      e.printStackTrace() 
      fail() 
     } 
    } 

} 

dank

Antwort

1

Sie Refactoring Code nicht überprüfbar zu sein, wie die bpmApiRestClient nicht verspottet werden kann. Machen Sie eine Abhängigkeit von dieser Klasse (statt bpmConfig) oder refactor, die Ergebnisse in eine separate Klasse abruft.

+0

Ich stimme voll und ganz zu, der beste Ansatz ist die Inversion der Kontrolle (verdrahten Sie die Klassen extern), aber wenn Sie ** hatten, Spott über einen Klassenkonstruktor durchzuführen, können Sie Poweramock verwenden, siehe [Blogbeitrag] (http: //benkiefer.com/blog/2013/04/23/powermockito-constructor-mocking/) – mikeapr4

+0

danke für deine Kommentare Jungs! Ich verstehe jetzt, dass es einige technische Herausforderungen gibt, ein lokales Methodenobjekt zu verspotten. Sieht so aus, als ob Powermock eine Option ist. – Richie