Mockito:模拟groovy休息客户电话

时间:2017-01-17 11:39:11

标签: groovy mockito

我正在使用Groovy的Mockito来使用Groovy rest客户端对一些休息调用进行单元测试。

如何在下面的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()
    }
}

在某个阶段,我按照下面的单元测试工作,但是一旦我重构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 个答案:

答案 0 :(得分:1)

您重构的代码是不可测试的,因为无法模拟bpmApiRestClient。使它成为这个类的依赖(而不是bpmConfig)或重构将结果检索到一个单独的类中。