java.lang.AssertionError:expected: 1, actual: 0 spring webflow junit
java.lang.AssertionError:expected: 1, actual: 0 spring webflow junit
当我使用 EasyMock 调用方法并设置方法调用的期望值时,方法 return 结果为 Map
。在我的测试用例中,未采用 return 结果通过 spring 网络流程。方法期望 spring webflow 的 RequestContext 是 org.springframework.webflow.execution.RequestContext
。我试图在 junit 测试用例中通过 MockRequestContext
但它不起作用
下面是错误
org.springframework.webflow.execution.ActionExecutionException: Exception thrown executing [AnnotatedAction@41e68d87 targetAction = [EvaluateAction@49ff7d8c expression = setErrorMessages.getErrorMessagesMap(flowRequestContext), resultExpression = flowScope.errorMessageMap], attributes = map[[empty]]] in state 'set_error_in_scope' of flow 'shclogin-flow' -- action execution attributes were 'map[[empty]]'
at org.springframework.webflow.execution.ActionExecutor.execute(ActionExecutor.java:60)
at org.springframework.webflow.engine.ActionState.doEnter(ActionState.java:101)
at org.springframework.webflow.engine.State.enter(State.java:194)
at org.springframework.webflow.engine.Transition.execute(Transition.java:228)
at org.springframework.webflow.engine.DecisionState.doEnter(DecisionState.java:51)
at org.springframework.webflow.engine.State.enter(State.java:194)
at org.springframework.webflow.engine.Transition.execute(Transition.java:228)
at org.springframework.webflow.engine.impl.FlowExecutionImpl.execute(FlowExecutionImpl.java:395)
at org.springframework.webflow.engine.impl.RequestControlContextImpl.execute(RequestControlContextImpl.java:214)
at org.springframework.webflow.engine.support.TransitionExecutingFlowExecutionExceptionHandler.handle(TransitionExecutingFlowExecutionExceptionHandler.java:111)
at org.springframework.webflow.engine.FlowExecutionExceptionHandlerSet.handleException(FlowExecutionExceptionHandlerSet.java:109)
at org.springframework.webflow.engine.Flow.handleException(Flow.java:600)
at org.springframework.webflow.engine.impl.FlowExecutionImpl.tryFlowHandlers(FlowExecutionImpl.java:647)
at org.springframework.webflow.engine.impl.FlowExecutionImpl.handleException(FlowExecutionImpl.java:603)
at org.springframework.webflow.engine.impl.FlowExecutionImpl.resume(FlowExecutionImpl.java:263)
at org.springframework.webflow.test.execution.AbstractFlowExecutionTests.resumeFlow(AbstractFlowExecutionTests.java:136)
at com.shc.ecom.test.usr.TestloginlFlow.testAction(TestloginlFlow.java:193)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:131)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: org.springframework.expression.ExpressionInvocationTargetException: A problem occurred when trying to execute method 'getErrorMessagesMap' on object of type [com.shc.ecom.sso.cas.web.flow.SetErrorMessages$$EnhancerByCGLIB$0571b9]
at org.springframework.expression.spel.ast.MethodReference.throwSimpleExceptionIfPossible(MethodReference.java:227)
at org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:133)
at org.springframework.expression.spel.ast.MethodReference.access[=10=]0(MethodReference.java:49)
at org.springframework.expression.spel.ast.MethodReference$MethodValueRef.getValue(MethodReference.java:342)
at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:88)
at org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:131)
at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:299)
at org.springframework.binding.expression.spel.SpringELExpression.getValue(SpringELExpression.java:84)
at org.springframework.webflow.action.EvaluateAction.doExecute(EvaluateAction.java:75)
at org.springframework.webflow.action.AbstractAction.execute(AbstractAction.java:188)
at org.springframework.webflow.execution.AnnotatedAction.execute(AnnotatedAction.java:145)
at org.springframework.webflow.execution.ActionExecutor.execute(ActionExecutor.java:51)
... 32 more
Caused by: java.lang.AssertionError:
Unexpected method call SetErrorMessages.getErrorMessagesMap([RequestControlContextImpl@c94fd30 externalContext = org.springframework.webflow.test.MockExternalContext@36328d33, currentEvent = [null], requestScope = map[[empty]], attributes = map[[empty]], messageContext = [DefaultMessageContext@2c4d1ac sourceMessages = map[[null] -> list[[empty]]]], flowExecution = [FlowExecutionImpl@7f0d96f2 flow = 'shclogin-flow', flowSessions = list[[FlowSessionImpl@545b995e flow = 'shclogin-flow', state = 'set_error_in_scope', scope = map[[empty]]]]]]):
SetErrorMessages.getErrorMessagesMap(flowRequestContext): expected: 1, actual: 0
at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:44)
at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:85)
at org.easymock.internal.ClassProxyFactory$MockMethodInterceptor.intercept(ClassProxyFactory.java:94)
at com.shc.ecom.sso.cas.web.flow.SetErrorMessages$$EnhancerByCGLIB$0571b9.getErrorMessagesMap(<generated>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.springframework.expression.spel.support.ReflectiveMethodExecutor.execute(ReflectiveMethodExecutor.java:112)
at org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:129)
... 42 more
测试用例
public class TestloginlFlow extends AbstractXmlFlowExecutionTests {
UsrInitialFlowSetupAction usrInitialFlowSetupAction;
AuthenticationViaFormAction authenticationViaFormAction;
UsrIsSYWRUserCheckAction usrIsSYWRUserCheckAction;
SSOGatewayService ssoGatewayService;
CustomGenerateServiceTicketAction generateServiceTicketAction;
CentralAuthenticationService centralAuthenticateService;
CookieRetrievingCookieGenerator warnCookieGenerator;
USRAuthenticationViaFormAction usrAuthenticationViaFormAction;
List<ArgumentExtractor> argumentExtractor;
SetErrorMessages setErrorMessages;
MockRequestContext flowRequestContext;
@Override
protected void setUp() throws Exception {
usrInitialFlowSetupAction = EasyMock.createMock("usrInitialFlowSetupAction", UsrInitialFlowSetupAction.class); // usrAuthenticationViaFormAction
setErrorMessages = EasyMock.createMock("SetErrorMessages", SetErrorMessages.class);
usrAuthenticationViaFormAction = EasyMock.createMock("usrAuthenticationViaFormAction",
USRAuthenticationViaFormAction.class);
usrIsSYWRUserCheckAction = EasyMock.createMock("usrIsSYWRUserCheckAction", UsrIsSYWRUserCheckAction.class); // ssoGatewayService
ssoGatewayService = EasyMock.createMock("ssoGatewayService", SSOGatewayService.class);
generateServiceTicketAction = EasyMock.createMock("generateServiceTicketAction",
CustomGenerateServiceTicketAction.class);
centralAuthenticateService = EasyMock.createMock("centralAuthenticateService",
CentralAuthenticationService.class);
warnCookieGenerator = EasyMock.createMock("centralAuthenticateService", CookieRetrievingCookieGenerator.class);
argumentExtractor = EasyMock.createMock("argumentExtractors", List.class);
generateServiceTicketAction = EasyMock.createMock("generateServiceTicketAction",
CustomGenerateServiceTicketAction.class);
flowRequestContext = EasyMock.createMock("flowRequestContext", MockRequestContext.class);
}
@Override
protected FlowDefinitionResource getResource(FlowDefinitionResourceFactory resourceFactory) {
return resourceFactory.createFileResource("src/main/webapp/WEB-INF/usr/flows/shclogin-flow.xml");
}
@Override
protected void registerMockFlowBeans(ConfigurableBeanFactory builderContext) {
builderContext.registerSingleton("usrInitialFlowSetupAction", usrInitialFlowSetupAction);
builderContext.registerSingleton("argumentExtractors", argumentExtractor);
builderContext.registerSingleton("warnCookieGenerator", warnCookieGenerator);
builderContext.registerSingleton("centralAuthenticateService", centralAuthenticateService);
builderContext.registerSingleton("usrAuthenticationViaFormAction", usrAuthenticationViaFormAction);
builderContext.registerSingleton("usrIsSYWRUserCheckAction", usrIsSYWRUserCheckAction);
builderContext.registerSingleton("ssoGatewayService", ssoGatewayService);
builderContext.registerSingleton("generateServiceTicketAction", generateServiceTicketAction);
builderContext.registerSingleton("ticketGrantingTicketCookieGenerator", warnCookieGenerator);
builderContext.registerSingleton("setErrorMessages", setErrorMessages);
builderContext.registerSingleton("flowRequestContext", flowRequestContext);
}
public void testAction1() throws Exception {
// setCurrentState("initialFlowSetup");
MockExternalContext ctx = new MockExternalContext();
MutableAttributeMap input = new LocalAttributeMap();
input.put("loginId", "12");
input.put("logonPassword", "ankur");
input.put("sourceSiteId", "3");
input.put("fullpage", "");
input.put("partialuser", "true");
input.put("service", "");
input.put("redirectUrl", "");
input.put("sywLogin", "er4fju");
input.put("tncmodal", null);
input.put("modifyservice", "no");
// input.put("reglogin", false);
// input.put("enrollresponse", 200);
input.put("shcCaptchaKey", null);
input.put("ticketGrantingTicketId", "1234");
Map<String, Object> parameters = new HashMap<>();
parameters.put("renew", "yes");
ParameterMap requestParameterMap = new LocalParameterMap(parameters);
ctx.setRequestParameterMap(requestParameterMap);
MockRequestContext context = new MockRequestContext();
Event event = new Event(this, "success");
EasyMock.expect(usrInitialFlowSetupAction.doExecute(flowRequestContext)).andReturn(event);
EasyMock.replay(usrInitialFlowSetupAction);
/*
* FlowExecution flowExecution = getFlowExecution(); FlowSession session
* = flowExecution.getActiveSession();
* session.getScope().put("ticketGrantingTicketId", "ee");
*/
// updateFlowExecution(flowExecution);
startFlow(input, ctx);
}
public void testAction() throws Exception {
setCurrentState("initialFlowSetup");
FlowExecutionContext flowExecution = getFlowExecution();
MockRequestContext context = new MockRequestContext();
MockExternalContext ctx = new MockExternalContext();
//context.setExternalContext(ctx);
//context.setFlowExecutionContext(flowExecution);
//context.setActiveSession(flowExecution.getActiveSession());
Map<String, Object> model = new HashMap<String, Object>();
model.put("originalUrl", 123);
model.put("parameters", "xyz");
// context.getFlowScope().put("errorMessageMap", model);
ctx.setEventId("error");
EasyMock.expect(setErrorMessages.getErrorMessagesMap(flowRequestContext)).andReturn(model);
EasyMock.replay(setErrorMessages);
resumeFlow(ctx);
assertResponseWrittenEquals("/loginfailure", ctx);
assertFlowExecutionEnded();
}
}
xml流量
version="1.0" encoding="UTF-8"?>
<flow xmlns="http://www.springframework.org/schema/webflow"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/webflow
http://www.springframework.org/schema/webflow/spring-webflow-2.4.xsd"
start-state="initialFlowSetup" >
<input name="loginId" value="requestScope.loginId" />
<input name="logonPassword" value="requestScope.logonPassword" />
<input name="sourceSiteId" value="requestScope.sourceSiteId" />
<input name="fullpage" value="requestScope.fullpage" />
<input name="partialuser" value="requestScope.partialuser" />
<input name="sourceSiteId" value="flowScope.sourceSite" />
<input name="service" value="requestScope.service" />
<input name="redirectUrl" value="requestScope.redirectUrl" />
<input name="sywLogin" value="requestScope.sywLogin" />
<input name="tncmodal" value="requestScope.tncmodal" />
<input name="modifyservice" value="requestScope.modifyservice" />
<input name="reglogin" value="flowScope.reglogin" />
<input name="enrollresponse" value="flowScope.enrollresponse" />
<input name="shcCaptchaKey" value="requestScope.shcKey" />
<input name="shcCaptchaResponse" value="requestScope.shcResponse" />
<input name="sywmax" value="flowScope.sywmax" />
<input name="auth" value="flowScope.auth" />
<input name="maxactivationflow" value="flowScope.maxactivationflow" />
<action-state id="initialFlowSetup">
<evaluate expression="usrInitialFlowSetupAction" />
<transition on="success" to="ticketGrantingTicketExistsCheck" />
<transition on="error" to="pickup_error_redirect" />
</action-state>
<decision-state id="ticketGrantingTicketExistsCheck">
<if test="flowScope.ticketGrantingTicketId != null" then="hasServiceCheck"
else="gatewayRequestCheck" />
</decision-state>
<decision-state id="gatewayRequestCheck">
<if
test="externalContext.requestParameterMap['gateway'] != '' && externalContext.requestParameterMap['gateway'] != null && flowScope.service != null"
then="redirect" else="submit" />
</decision-state>
<decision-state id="hasServiceCheck">
<if test="flowScope.service != null" then="renewRequestCheck"
else="viewGenericLoginSuccess" />
</decision-state>
<decision-state id="renewRequestCheck">
<if
test="externalContext.requestParameterMap['renew'] != '' && externalContext.requestParameterMap['renew'] != null"
then="submit" else="generateServiceTicket" />
</decision-state>
<!-- The "warn" action makes the determination of whether to redirect directly
to the requested service or display the "confirmation" page to go back to
the server. -->
<decision-state id="warn">
<if test="flowScope.warnCookieValue" then="showWarningView"
else="redirect" />
</decision-state>
<!-- <action-state id="startAuthenticate"> <action bean="x509Check" /> <transition
on="success" to="sendTicketGrantingTicket" /> <transition on="error" to="viewLoginForm"
/> </action-state> -->
<view-state id="viewLoginForm" view="casLoginView">
<on-render>
<evaluate expression="authenticationViaFormAction.setupForm()" />
<evaluate expression="authenticationViaFormAction.referenceData()"/>
</on-render>
<transition on="submit" to="bindAndValidate" />
</view-state>
<action-state id="bindAndValidate">
<evaluate expression="usrAuthenticationViaFormAction" />
<transition on="success" to="submit" />
<transition on="error" to="redirect" />
</action-state>
<action-state id="submit">
<evaluate expression = "usrAuthenticationViaFormAction.setCredentialsToFlowScope()" />
<evaluate expression="usrAuthenticationViaFormAction.submit(flowRequestContext, flowScope.credentials, messageContext)" />
<transition on="success" to="sendTicketGrantingTicket" />
<transition on="authenticationFailure" to="pickup_error_redirect" />
<transition on="error" to="pickup_error_redirect">
<set name="errorCode" value="flowScope.errorCode" /> <!-- scope="conversation" />-->
</transition>
</action-state>
<action-state id="sendTicketGrantingTicket">
<evaluate expression="sendTicketGrantingTicketAction" />
<transition on="success" to="serviceCheck" />
</action-state>
<decision-state id="serviceCheck">
<if test="flowScope.service != null" then="checkEnrollResponse"
else="viewGenericLoginSuccess" />
</decision-state>
<decision-state id="checkEnrollResponse">
<if test="flowScope.enrollresponse != null" then="generateServiceTicket"
else="checksywrrequired" />
</decision-state>
<!-- select the success modal based on the flow caller -->
<decision-state id="checksywrrequired">
<if test="requestScope.sywLogin == 'true'" then="sywrRequired"
else="generateServiceTicket" />
</decision-state>
<action-state id="sywrRequired">
<evaluate expression="usrIsSYWRUserCheckAction" />
<transition on="success" to="isAffinityCheckRequired" />
<transition on="error" to="generateServiceTicketNoSywr" />
</action-state>
<decision-state id="isAffinityCheckRequired">
<if test="requestScope.sourceSiteId==6" then="craftsmanAffinityCheck"
else="generateServiceTicket" />
</decision-state>
<action-state id="craftsmanAffinityCheck">
<evaluate expression="ssoGatewayService.searchUserByMemberNumberInTelluride(flowScope.sywrNumber,
requestParameters.sourceSiteId)" result="returnEmailResponse"/>
<transition on="success" to="checkForCcAffinityModal" />
</action-state>
<!--
<bean-action bean="ssoGatewayService" method="searchUserByMemberNumberInTelluride">
<method-arguments>
<argument expression="flowScope.sywrNumber" />
<argument expression="${requestParameters.sourceSiteId}" />
</method-arguments>
<method-result name="returnEmailResponse" scope="flow" />
</bean-action>
-->
<decision-state id="checkForCcAffinityModal">
<if test="flowScope.returnEmailResponse.ccAffinity==true" then="generateServiceTicket"
else="generateServiceTicketNoCcaffinity" />
</decision-state>
<action-state id="generateServiceTicketNoSywr">
<evaluate expression="generateServiceTicketAction" />
<transition on="success" to="sendtickettomodalforloginnosywr" />
<transition on="error" to="setErrorCode" />
<transition on="gateway" to="redirect" />
</action-state>
<action-state id="generateServiceTicketNoCcaffinity">
<evaluate expression="generateServiceTicketAction" />
<transition on="success" to="sendtickettomodalforloginnoccaffinity" />
<transition on="error" to="setErrorCode" />
<transition on="gateway" to="redirect" />
</action-state>
<action-state id="generateServiceTicket">
<evaluate expression="generateServiceTicketAction" />
<transition on="success" to="pickupticketmodal" />
<transition on="error" to="setErrorCode" />
<transition on="gateway" to="redirect" />
</action-state>
<action-state id="setErrorCode">
<evaluate expression="setErrorCodeBean.submit()" />
<transition on="success" to="pickup_error_redirect" />
</action-state>
<!-- the "viewGenericLogin" is the end state for when a user attempts to
login without coming directly from a service. They have only initialized
their single-sign on session. -->
<end-state id="viewGenericLoginSuccess" view="casLoginGenericSuccessView" />
<!-- The "showWarningView" end state is the end state for when the user
has requested privacy settings (to be "warned") to be turned on. It delegates
to a view defines in default_views.properties that display the "Please click
here to go to the service." message. -->
<end-state id="showWarningView" view="casLoginConfirmView" />
<!-- The "redirect" end state allows CAS to properly end the workflow while
still redirecting the user back to the service required. -->
<end-state id="redirect" view="externalRedirect:#{requestScope.response.url}" />
<end-state id="viewServiceErrorView" view="viewServiceErrorView" />
<end-state id="viewServiceSsoErrorView" view="viewServiceSsoErrorView" />
<!-- select the success modal based on the flow caller -->
<decision-state id="pickupticketmodal">
<if test="flowScope.enrollresponse != null" then="sendtickettomodal_reg"
else="sendTicket" />
</decision-state>
<!-- send the service ticket back to the modal, no view required in this
subflow -->
<end-state id="sendtickettomodal_reg">
<output name = "serviceTicketId" value = "requestScope.serviceTicketId"/>
</end-state>
<!-- <output-mapper>
<mapping source="${requestScope.serviceTicketId}" target="serviceTicketId" />
</output-mapper> -->
<decision-state id="sendTicket">
<if test="flowScope.auth != null && flowScope.auth != ''"
then="sendtickettomodalforloginnosywr" else="sendtickettomodalforlogin" />
</decision-state>
<end-state id="sendtickettomodalforlogin" view="/displayserviceticketandcookie">
<output name = "modifyservice" value = "requestScope.modifyservice"/>
<output name = "sywmax" value = "requestScope.sywmax"/>
<output name = "irp" value = "requestScope.irp"/>
<output name = "auth" value = "requestScope.auth"/>
</end-state>
<!--
<output-mapper>
<mapping source="${requestScope.modifyservice}" target="modifyservice"/>
<mapping source="${requestScope.sywmax}" target="sywmax"/>
<mapping source="${requestScope.irp}" target="irp"/>
<mapping source="${requestScope.auth}" target="auth"/>
</output-mapper>
-->
<!-- for login, directly sending the st to the modal -->
<end-state id="sendtickettomodalforloginnosywr" view="displayserviceticketandcookienosywr" >
<output name = "modifyservice" value = "requestScope.modifyservice"/>
<output name = "irp" value = "requestScope.irp"/>
</end-state>
<!--
<output-mapper>
<mapping source="${requestScope.modifyservice}" target="modifyservice" />
<mapping source="${requestScope.irp}" target="irp" />
</output-mapper>
-->
<end-state id="sendtickettomodalforloginnoccaffinity" view="displayserviceticketandcookienoccaffinity">
<output name = "modifyservice" value = "requestScope.modifyservice"/>
<output name = "irp" value = "requestScope.irp"/>
</end-state>
<!--
<output-mapper>
<mapping source="${requestScope.modifyservice}" target="modifyservice" />
<mapping source="${requestScope.irp}" target="irp" />
</output-mapper>
-->
<!-- for login, directly sending the st to the modal -->
<end-state id="showTnCModal" view="/showTnCModalToUsers">
</end-state>
<!-- select the error redirect based on the flow caller -->
<decision-state id="pickup_error_redirect">
<if test="flowScope.enrollresponse != null" then="pickup_error_redirect_reg"
else="set_error_in_scope" />
</decision-state>
<action-state id="set_error_in_scope">
<evaluate expression="setErrorMessages.getErrorMessagesMap(flowRequestContext)" result="flowScope.errorMessageMap"
result-type="java.util.HashMap"></evaluate>
<transition on="success" to="pickup_error_redirect_login"> </transition>
</action-state>
<!-- redirect when error to create sso session, no view required in this subflow -->
<end-state id="pickup_error_redirect_reg" />
<end-state id="pickup_error_redirect_login" view="/loginfailure" >
<on-entry>
<set name="flowScope.parameters" value="flowScope.errorMessageMap.parameters"></set>
</on-entry>
</end-state>
<!-- current not properly defined the global error condition -->
<global-transitions>
<transition to="pickup_error_redirect"
on-exception="org.springframework.webflow.execution.repository.NoSuchFlowExecutionException" />
<transition to="pickup_error_redirect"
on-exception="org.jasig.cas.services.UnauthorizedSsoServiceException" />
<transition to="pickup_error_redirect"
on-exception="org.jasig.cas.services.UnauthorizedServiceException" />
<transition to="pickup_error_redirect"
on-exception="org.springframework.webflow.execution.FlowExecutionException" />
</global-transitions>
</flow>
您仍然遇到同样的问题,这些问题与模拟和期望完全相同的对象作为参数有关。
你为什么这么关心flowRequestContext对象?
EasyMock.expect(setErrorMessages.getErrorMessagesMap(flowRequestContext)).andReturn(model);
只需使用:
EasyMock.expect(setErrorMessages.getErrorMessagesMap((RequestContext)EasyMock.anyObject())).andReturn(model);
这将适用于流程中的任何 RequestContext 实例
当我使用 EasyMock 调用方法并设置方法调用的期望值时,方法 return 结果为 Map
。在我的测试用例中,未采用 return 结果通过 spring 网络流程。方法期望 spring webflow 的 RequestContext 是 org.springframework.webflow.execution.RequestContext
。我试图在 junit 测试用例中通过 MockRequestContext
但它不起作用
下面是错误
org.springframework.webflow.execution.ActionExecutionException: Exception thrown executing [AnnotatedAction@41e68d87 targetAction = [EvaluateAction@49ff7d8c expression = setErrorMessages.getErrorMessagesMap(flowRequestContext), resultExpression = flowScope.errorMessageMap], attributes = map[[empty]]] in state 'set_error_in_scope' of flow 'shclogin-flow' -- action execution attributes were 'map[[empty]]'
at org.springframework.webflow.execution.ActionExecutor.execute(ActionExecutor.java:60)
at org.springframework.webflow.engine.ActionState.doEnter(ActionState.java:101)
at org.springframework.webflow.engine.State.enter(State.java:194)
at org.springframework.webflow.engine.Transition.execute(Transition.java:228)
at org.springframework.webflow.engine.DecisionState.doEnter(DecisionState.java:51)
at org.springframework.webflow.engine.State.enter(State.java:194)
at org.springframework.webflow.engine.Transition.execute(Transition.java:228)
at org.springframework.webflow.engine.impl.FlowExecutionImpl.execute(FlowExecutionImpl.java:395)
at org.springframework.webflow.engine.impl.RequestControlContextImpl.execute(RequestControlContextImpl.java:214)
at org.springframework.webflow.engine.support.TransitionExecutingFlowExecutionExceptionHandler.handle(TransitionExecutingFlowExecutionExceptionHandler.java:111)
at org.springframework.webflow.engine.FlowExecutionExceptionHandlerSet.handleException(FlowExecutionExceptionHandlerSet.java:109)
at org.springframework.webflow.engine.Flow.handleException(Flow.java:600)
at org.springframework.webflow.engine.impl.FlowExecutionImpl.tryFlowHandlers(FlowExecutionImpl.java:647)
at org.springframework.webflow.engine.impl.FlowExecutionImpl.handleException(FlowExecutionImpl.java:603)
at org.springframework.webflow.engine.impl.FlowExecutionImpl.resume(FlowExecutionImpl.java:263)
at org.springframework.webflow.test.execution.AbstractFlowExecutionTests.resumeFlow(AbstractFlowExecutionTests.java:136)
at com.shc.ecom.test.usr.TestloginlFlow.testAction(TestloginlFlow.java:193)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:131)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: org.springframework.expression.ExpressionInvocationTargetException: A problem occurred when trying to execute method 'getErrorMessagesMap' on object of type [com.shc.ecom.sso.cas.web.flow.SetErrorMessages$$EnhancerByCGLIB$0571b9]
at org.springframework.expression.spel.ast.MethodReference.throwSimpleExceptionIfPossible(MethodReference.java:227)
at org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:133)
at org.springframework.expression.spel.ast.MethodReference.access[=10=]0(MethodReference.java:49)
at org.springframework.expression.spel.ast.MethodReference$MethodValueRef.getValue(MethodReference.java:342)
at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:88)
at org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:131)
at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:299)
at org.springframework.binding.expression.spel.SpringELExpression.getValue(SpringELExpression.java:84)
at org.springframework.webflow.action.EvaluateAction.doExecute(EvaluateAction.java:75)
at org.springframework.webflow.action.AbstractAction.execute(AbstractAction.java:188)
at org.springframework.webflow.execution.AnnotatedAction.execute(AnnotatedAction.java:145)
at org.springframework.webflow.execution.ActionExecutor.execute(ActionExecutor.java:51)
... 32 more
Caused by: java.lang.AssertionError:
Unexpected method call SetErrorMessages.getErrorMessagesMap([RequestControlContextImpl@c94fd30 externalContext = org.springframework.webflow.test.MockExternalContext@36328d33, currentEvent = [null], requestScope = map[[empty]], attributes = map[[empty]], messageContext = [DefaultMessageContext@2c4d1ac sourceMessages = map[[null] -> list[[empty]]]], flowExecution = [FlowExecutionImpl@7f0d96f2 flow = 'shclogin-flow', flowSessions = list[[FlowSessionImpl@545b995e flow = 'shclogin-flow', state = 'set_error_in_scope', scope = map[[empty]]]]]]):
SetErrorMessages.getErrorMessagesMap(flowRequestContext): expected: 1, actual: 0
at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:44)
at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:85)
at org.easymock.internal.ClassProxyFactory$MockMethodInterceptor.intercept(ClassProxyFactory.java:94)
at com.shc.ecom.sso.cas.web.flow.SetErrorMessages$$EnhancerByCGLIB$0571b9.getErrorMessagesMap(<generated>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.springframework.expression.spel.support.ReflectiveMethodExecutor.execute(ReflectiveMethodExecutor.java:112)
at org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:129)
... 42 more
测试用例
public class TestloginlFlow extends AbstractXmlFlowExecutionTests {
UsrInitialFlowSetupAction usrInitialFlowSetupAction;
AuthenticationViaFormAction authenticationViaFormAction;
UsrIsSYWRUserCheckAction usrIsSYWRUserCheckAction;
SSOGatewayService ssoGatewayService;
CustomGenerateServiceTicketAction generateServiceTicketAction;
CentralAuthenticationService centralAuthenticateService;
CookieRetrievingCookieGenerator warnCookieGenerator;
USRAuthenticationViaFormAction usrAuthenticationViaFormAction;
List<ArgumentExtractor> argumentExtractor;
SetErrorMessages setErrorMessages;
MockRequestContext flowRequestContext;
@Override
protected void setUp() throws Exception {
usrInitialFlowSetupAction = EasyMock.createMock("usrInitialFlowSetupAction", UsrInitialFlowSetupAction.class); // usrAuthenticationViaFormAction
setErrorMessages = EasyMock.createMock("SetErrorMessages", SetErrorMessages.class);
usrAuthenticationViaFormAction = EasyMock.createMock("usrAuthenticationViaFormAction",
USRAuthenticationViaFormAction.class);
usrIsSYWRUserCheckAction = EasyMock.createMock("usrIsSYWRUserCheckAction", UsrIsSYWRUserCheckAction.class); // ssoGatewayService
ssoGatewayService = EasyMock.createMock("ssoGatewayService", SSOGatewayService.class);
generateServiceTicketAction = EasyMock.createMock("generateServiceTicketAction",
CustomGenerateServiceTicketAction.class);
centralAuthenticateService = EasyMock.createMock("centralAuthenticateService",
CentralAuthenticationService.class);
warnCookieGenerator = EasyMock.createMock("centralAuthenticateService", CookieRetrievingCookieGenerator.class);
argumentExtractor = EasyMock.createMock("argumentExtractors", List.class);
generateServiceTicketAction = EasyMock.createMock("generateServiceTicketAction",
CustomGenerateServiceTicketAction.class);
flowRequestContext = EasyMock.createMock("flowRequestContext", MockRequestContext.class);
}
@Override
protected FlowDefinitionResource getResource(FlowDefinitionResourceFactory resourceFactory) {
return resourceFactory.createFileResource("src/main/webapp/WEB-INF/usr/flows/shclogin-flow.xml");
}
@Override
protected void registerMockFlowBeans(ConfigurableBeanFactory builderContext) {
builderContext.registerSingleton("usrInitialFlowSetupAction", usrInitialFlowSetupAction);
builderContext.registerSingleton("argumentExtractors", argumentExtractor);
builderContext.registerSingleton("warnCookieGenerator", warnCookieGenerator);
builderContext.registerSingleton("centralAuthenticateService", centralAuthenticateService);
builderContext.registerSingleton("usrAuthenticationViaFormAction", usrAuthenticationViaFormAction);
builderContext.registerSingleton("usrIsSYWRUserCheckAction", usrIsSYWRUserCheckAction);
builderContext.registerSingleton("ssoGatewayService", ssoGatewayService);
builderContext.registerSingleton("generateServiceTicketAction", generateServiceTicketAction);
builderContext.registerSingleton("ticketGrantingTicketCookieGenerator", warnCookieGenerator);
builderContext.registerSingleton("setErrorMessages", setErrorMessages);
builderContext.registerSingleton("flowRequestContext", flowRequestContext);
}
public void testAction1() throws Exception {
// setCurrentState("initialFlowSetup");
MockExternalContext ctx = new MockExternalContext();
MutableAttributeMap input = new LocalAttributeMap();
input.put("loginId", "12");
input.put("logonPassword", "ankur");
input.put("sourceSiteId", "3");
input.put("fullpage", "");
input.put("partialuser", "true");
input.put("service", "");
input.put("redirectUrl", "");
input.put("sywLogin", "er4fju");
input.put("tncmodal", null);
input.put("modifyservice", "no");
// input.put("reglogin", false);
// input.put("enrollresponse", 200);
input.put("shcCaptchaKey", null);
input.put("ticketGrantingTicketId", "1234");
Map<String, Object> parameters = new HashMap<>();
parameters.put("renew", "yes");
ParameterMap requestParameterMap = new LocalParameterMap(parameters);
ctx.setRequestParameterMap(requestParameterMap);
MockRequestContext context = new MockRequestContext();
Event event = new Event(this, "success");
EasyMock.expect(usrInitialFlowSetupAction.doExecute(flowRequestContext)).andReturn(event);
EasyMock.replay(usrInitialFlowSetupAction);
/*
* FlowExecution flowExecution = getFlowExecution(); FlowSession session
* = flowExecution.getActiveSession();
* session.getScope().put("ticketGrantingTicketId", "ee");
*/
// updateFlowExecution(flowExecution);
startFlow(input, ctx);
}
public void testAction() throws Exception {
setCurrentState("initialFlowSetup");
FlowExecutionContext flowExecution = getFlowExecution();
MockRequestContext context = new MockRequestContext();
MockExternalContext ctx = new MockExternalContext();
//context.setExternalContext(ctx);
//context.setFlowExecutionContext(flowExecution);
//context.setActiveSession(flowExecution.getActiveSession());
Map<String, Object> model = new HashMap<String, Object>();
model.put("originalUrl", 123);
model.put("parameters", "xyz");
// context.getFlowScope().put("errorMessageMap", model);
ctx.setEventId("error");
EasyMock.expect(setErrorMessages.getErrorMessagesMap(flowRequestContext)).andReturn(model);
EasyMock.replay(setErrorMessages);
resumeFlow(ctx);
assertResponseWrittenEquals("/loginfailure", ctx);
assertFlowExecutionEnded();
}
}
xml流量
version="1.0" encoding="UTF-8"?>
<flow xmlns="http://www.springframework.org/schema/webflow"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/webflow
http://www.springframework.org/schema/webflow/spring-webflow-2.4.xsd"
start-state="initialFlowSetup" >
<input name="loginId" value="requestScope.loginId" />
<input name="logonPassword" value="requestScope.logonPassword" />
<input name="sourceSiteId" value="requestScope.sourceSiteId" />
<input name="fullpage" value="requestScope.fullpage" />
<input name="partialuser" value="requestScope.partialuser" />
<input name="sourceSiteId" value="flowScope.sourceSite" />
<input name="service" value="requestScope.service" />
<input name="redirectUrl" value="requestScope.redirectUrl" />
<input name="sywLogin" value="requestScope.sywLogin" />
<input name="tncmodal" value="requestScope.tncmodal" />
<input name="modifyservice" value="requestScope.modifyservice" />
<input name="reglogin" value="flowScope.reglogin" />
<input name="enrollresponse" value="flowScope.enrollresponse" />
<input name="shcCaptchaKey" value="requestScope.shcKey" />
<input name="shcCaptchaResponse" value="requestScope.shcResponse" />
<input name="sywmax" value="flowScope.sywmax" />
<input name="auth" value="flowScope.auth" />
<input name="maxactivationflow" value="flowScope.maxactivationflow" />
<action-state id="initialFlowSetup">
<evaluate expression="usrInitialFlowSetupAction" />
<transition on="success" to="ticketGrantingTicketExistsCheck" />
<transition on="error" to="pickup_error_redirect" />
</action-state>
<decision-state id="ticketGrantingTicketExistsCheck">
<if test="flowScope.ticketGrantingTicketId != null" then="hasServiceCheck"
else="gatewayRequestCheck" />
</decision-state>
<decision-state id="gatewayRequestCheck">
<if
test="externalContext.requestParameterMap['gateway'] != '' && externalContext.requestParameterMap['gateway'] != null && flowScope.service != null"
then="redirect" else="submit" />
</decision-state>
<decision-state id="hasServiceCheck">
<if test="flowScope.service != null" then="renewRequestCheck"
else="viewGenericLoginSuccess" />
</decision-state>
<decision-state id="renewRequestCheck">
<if
test="externalContext.requestParameterMap['renew'] != '' && externalContext.requestParameterMap['renew'] != null"
then="submit" else="generateServiceTicket" />
</decision-state>
<!-- The "warn" action makes the determination of whether to redirect directly
to the requested service or display the "confirmation" page to go back to
the server. -->
<decision-state id="warn">
<if test="flowScope.warnCookieValue" then="showWarningView"
else="redirect" />
</decision-state>
<!-- <action-state id="startAuthenticate"> <action bean="x509Check" /> <transition
on="success" to="sendTicketGrantingTicket" /> <transition on="error" to="viewLoginForm"
/> </action-state> -->
<view-state id="viewLoginForm" view="casLoginView">
<on-render>
<evaluate expression="authenticationViaFormAction.setupForm()" />
<evaluate expression="authenticationViaFormAction.referenceData()"/>
</on-render>
<transition on="submit" to="bindAndValidate" />
</view-state>
<action-state id="bindAndValidate">
<evaluate expression="usrAuthenticationViaFormAction" />
<transition on="success" to="submit" />
<transition on="error" to="redirect" />
</action-state>
<action-state id="submit">
<evaluate expression = "usrAuthenticationViaFormAction.setCredentialsToFlowScope()" />
<evaluate expression="usrAuthenticationViaFormAction.submit(flowRequestContext, flowScope.credentials, messageContext)" />
<transition on="success" to="sendTicketGrantingTicket" />
<transition on="authenticationFailure" to="pickup_error_redirect" />
<transition on="error" to="pickup_error_redirect">
<set name="errorCode" value="flowScope.errorCode" /> <!-- scope="conversation" />-->
</transition>
</action-state>
<action-state id="sendTicketGrantingTicket">
<evaluate expression="sendTicketGrantingTicketAction" />
<transition on="success" to="serviceCheck" />
</action-state>
<decision-state id="serviceCheck">
<if test="flowScope.service != null" then="checkEnrollResponse"
else="viewGenericLoginSuccess" />
</decision-state>
<decision-state id="checkEnrollResponse">
<if test="flowScope.enrollresponse != null" then="generateServiceTicket"
else="checksywrrequired" />
</decision-state>
<!-- select the success modal based on the flow caller -->
<decision-state id="checksywrrequired">
<if test="requestScope.sywLogin == 'true'" then="sywrRequired"
else="generateServiceTicket" />
</decision-state>
<action-state id="sywrRequired">
<evaluate expression="usrIsSYWRUserCheckAction" />
<transition on="success" to="isAffinityCheckRequired" />
<transition on="error" to="generateServiceTicketNoSywr" />
</action-state>
<decision-state id="isAffinityCheckRequired">
<if test="requestScope.sourceSiteId==6" then="craftsmanAffinityCheck"
else="generateServiceTicket" />
</decision-state>
<action-state id="craftsmanAffinityCheck">
<evaluate expression="ssoGatewayService.searchUserByMemberNumberInTelluride(flowScope.sywrNumber,
requestParameters.sourceSiteId)" result="returnEmailResponse"/>
<transition on="success" to="checkForCcAffinityModal" />
</action-state>
<!--
<bean-action bean="ssoGatewayService" method="searchUserByMemberNumberInTelluride">
<method-arguments>
<argument expression="flowScope.sywrNumber" />
<argument expression="${requestParameters.sourceSiteId}" />
</method-arguments>
<method-result name="returnEmailResponse" scope="flow" />
</bean-action>
-->
<decision-state id="checkForCcAffinityModal">
<if test="flowScope.returnEmailResponse.ccAffinity==true" then="generateServiceTicket"
else="generateServiceTicketNoCcaffinity" />
</decision-state>
<action-state id="generateServiceTicketNoSywr">
<evaluate expression="generateServiceTicketAction" />
<transition on="success" to="sendtickettomodalforloginnosywr" />
<transition on="error" to="setErrorCode" />
<transition on="gateway" to="redirect" />
</action-state>
<action-state id="generateServiceTicketNoCcaffinity">
<evaluate expression="generateServiceTicketAction" />
<transition on="success" to="sendtickettomodalforloginnoccaffinity" />
<transition on="error" to="setErrorCode" />
<transition on="gateway" to="redirect" />
</action-state>
<action-state id="generateServiceTicket">
<evaluate expression="generateServiceTicketAction" />
<transition on="success" to="pickupticketmodal" />
<transition on="error" to="setErrorCode" />
<transition on="gateway" to="redirect" />
</action-state>
<action-state id="setErrorCode">
<evaluate expression="setErrorCodeBean.submit()" />
<transition on="success" to="pickup_error_redirect" />
</action-state>
<!-- the "viewGenericLogin" is the end state for when a user attempts to
login without coming directly from a service. They have only initialized
their single-sign on session. -->
<end-state id="viewGenericLoginSuccess" view="casLoginGenericSuccessView" />
<!-- The "showWarningView" end state is the end state for when the user
has requested privacy settings (to be "warned") to be turned on. It delegates
to a view defines in default_views.properties that display the "Please click
here to go to the service." message. -->
<end-state id="showWarningView" view="casLoginConfirmView" />
<!-- The "redirect" end state allows CAS to properly end the workflow while
still redirecting the user back to the service required. -->
<end-state id="redirect" view="externalRedirect:#{requestScope.response.url}" />
<end-state id="viewServiceErrorView" view="viewServiceErrorView" />
<end-state id="viewServiceSsoErrorView" view="viewServiceSsoErrorView" />
<!-- select the success modal based on the flow caller -->
<decision-state id="pickupticketmodal">
<if test="flowScope.enrollresponse != null" then="sendtickettomodal_reg"
else="sendTicket" />
</decision-state>
<!-- send the service ticket back to the modal, no view required in this
subflow -->
<end-state id="sendtickettomodal_reg">
<output name = "serviceTicketId" value = "requestScope.serviceTicketId"/>
</end-state>
<!-- <output-mapper>
<mapping source="${requestScope.serviceTicketId}" target="serviceTicketId" />
</output-mapper> -->
<decision-state id="sendTicket">
<if test="flowScope.auth != null && flowScope.auth != ''"
then="sendtickettomodalforloginnosywr" else="sendtickettomodalforlogin" />
</decision-state>
<end-state id="sendtickettomodalforlogin" view="/displayserviceticketandcookie">
<output name = "modifyservice" value = "requestScope.modifyservice"/>
<output name = "sywmax" value = "requestScope.sywmax"/>
<output name = "irp" value = "requestScope.irp"/>
<output name = "auth" value = "requestScope.auth"/>
</end-state>
<!--
<output-mapper>
<mapping source="${requestScope.modifyservice}" target="modifyservice"/>
<mapping source="${requestScope.sywmax}" target="sywmax"/>
<mapping source="${requestScope.irp}" target="irp"/>
<mapping source="${requestScope.auth}" target="auth"/>
</output-mapper>
-->
<!-- for login, directly sending the st to the modal -->
<end-state id="sendtickettomodalforloginnosywr" view="displayserviceticketandcookienosywr" >
<output name = "modifyservice" value = "requestScope.modifyservice"/>
<output name = "irp" value = "requestScope.irp"/>
</end-state>
<!--
<output-mapper>
<mapping source="${requestScope.modifyservice}" target="modifyservice" />
<mapping source="${requestScope.irp}" target="irp" />
</output-mapper>
-->
<end-state id="sendtickettomodalforloginnoccaffinity" view="displayserviceticketandcookienoccaffinity">
<output name = "modifyservice" value = "requestScope.modifyservice"/>
<output name = "irp" value = "requestScope.irp"/>
</end-state>
<!--
<output-mapper>
<mapping source="${requestScope.modifyservice}" target="modifyservice" />
<mapping source="${requestScope.irp}" target="irp" />
</output-mapper>
-->
<!-- for login, directly sending the st to the modal -->
<end-state id="showTnCModal" view="/showTnCModalToUsers">
</end-state>
<!-- select the error redirect based on the flow caller -->
<decision-state id="pickup_error_redirect">
<if test="flowScope.enrollresponse != null" then="pickup_error_redirect_reg"
else="set_error_in_scope" />
</decision-state>
<action-state id="set_error_in_scope">
<evaluate expression="setErrorMessages.getErrorMessagesMap(flowRequestContext)" result="flowScope.errorMessageMap"
result-type="java.util.HashMap"></evaluate>
<transition on="success" to="pickup_error_redirect_login"> </transition>
</action-state>
<!-- redirect when error to create sso session, no view required in this subflow -->
<end-state id="pickup_error_redirect_reg" />
<end-state id="pickup_error_redirect_login" view="/loginfailure" >
<on-entry>
<set name="flowScope.parameters" value="flowScope.errorMessageMap.parameters"></set>
</on-entry>
</end-state>
<!-- current not properly defined the global error condition -->
<global-transitions>
<transition to="pickup_error_redirect"
on-exception="org.springframework.webflow.execution.repository.NoSuchFlowExecutionException" />
<transition to="pickup_error_redirect"
on-exception="org.jasig.cas.services.UnauthorizedSsoServiceException" />
<transition to="pickup_error_redirect"
on-exception="org.jasig.cas.services.UnauthorizedServiceException" />
<transition to="pickup_error_redirect"
on-exception="org.springframework.webflow.execution.FlowExecutionException" />
</global-transitions>
</flow>
您仍然遇到同样的问题,这些问题与模拟和期望完全相同的对象作为参数有关。
你为什么这么关心flowRequestContext对象?
EasyMock.expect(setErrorMessages.getErrorMessagesMap(flowRequestContext)).andReturn(model);
只需使用:
EasyMock.expect(setErrorMessages.getErrorMessagesMap((RequestContext)EasyMock.anyObject())).andReturn(model);
这将适用于流程中的任何 RequestContext 实例