2017-01-17 6 views
0

私はGroovyでMockitoを使って、Groovy restクライアントを使っていくつかの残りの呼び出しをテストしています。Mockito:モックグルーヴィーレストクライアントコール

以下のupdatePhaseメソッドでbpmApiRestClient.get呼び出しをモックできますか?

@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() 
    } 
} 

は1つの段階では、私は以下のユニットテストあたりとして働くものを持っていたが、私はbpmApiRestClientをリファクタリングしたらメソッド内ではなく、モックは動作を停止クラスレベルでインスタンス化されます。

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() 
     } 
    } 

} 

おかげ

答えて

1

あなたはbpmApiRestClientを嘲笑することはできないとしてテスト不能であるためにあなたのコードをリファクタリング。 bpmConfigの代わりにこのクラスの依存関係にするか、結果を別のクラスに取得するリファクタリングします。

+0

私は、最良のアプローチはコントロールの逆転(外部クラスを結ぶ)だと完全に同意しますが、クラスコンストラクタでmockingを実行していた場合、Powermockを使用することができます。 //benkiefer.com/blog/2013/04/23/powermockito-constructor-mocking/) – mikeapr4

+0

コメントをいただきありがとうございます!私は今、ローカルメソッドオブジェクトを嘲笑するいくつかの技術的課題があることを理解しています。私はそれを得るためにしたい場合のように見えるPowermockはオプションです。 – Richie