【问题标题】:Mockito : Mock groovy rest client callMockito:模拟 groovy 客户端调用
【发布时间】:2017-01-17 11:39:11
【问题描述】:

我将 Mockito 与 Groovy 一起使用,以使用 Groovy 休息客户端对一些休息调用进行单元测试。

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

}

谢谢

【问题讨论】:

    标签: groovy mockito


    【解决方案1】:

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

    【讨论】:

    • 我完全同意最好的方法是控制反转(从外部连接类),但是如果您不得不对类构造函数执行模拟,您可以使用 Powermock,请参阅这个blog post
    • 感谢你们的 cmets 伙计们!我现在明白在模拟本地方法对象时存在一些技术挑战。看起来如果我确实想让它运行 Powermock 是一种选择。
    猜你喜欢
    • 1970-01-01
    • 2022-06-10
    • 2017-03-17
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多