我正在使用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()
}
}
}
感谢
答案 0 :(得分:1)
您重构的代码是不可测试的,因为无法模拟bpmApiRestClient
。使它成为这个类的依赖(而不是bpmConfig)或重构将结果检索到一个单独的类中。