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
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
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