/*
* Copyright 2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.statemachine.processor;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import java.lang.reflect.Method;
import java.util.Map;
import org.junit.Test;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.statemachine.ExtendedState;
import org.springframework.statemachine.StateContext;
import org.springframework.statemachine.StateContext.Stage;
import org.springframework.statemachine.StateMachine;
import org.springframework.statemachine.annotation.EventHeaders;
import org.springframework.statemachine.annotation.OnTransition;
import org.springframework.statemachine.state.State;
import org.springframework.statemachine.support.DefaultExtendedState;
import org.springframework.statemachine.support.DefaultStateContext;
import org.springframework.statemachine.transition.Transition;
import org.springframework.util.ReflectionUtils;
public class MethodParameterTests {
@SuppressWarnings("unchecked")
@Test
public void testOnTransition() {
Bean1 bean1 = new Bean1();
Method method = ReflectionUtils.findMethod(Bean1.class, "onTransition", Map.class, ExtendedState.class, StateMachine.class,
Message.class, Exception.class, StateContext.class);
OnTransition annotation = AnnotationUtils.findAnnotation(method, OnTransition.class);
StateMachineHandler<OnTransition, String, String> handler = new StateMachineHandler<OnTransition, String, String>(Bean1.class,
bean1, method, annotation, annotation);
Message<String> message = MessageBuilder.withPayload("S").build();
MessageHeaders messageHeaders = message.getHeaders();
ExtendedState extendedState = new DefaultExtendedState();
Transition<String, String> transition = mock(Transition.class);
StateMachine<String, String> stateMachine = mock(StateMachine.class);
State<String, String> source = mock(State.class);
State<String, String> target = mock(State.class);
Exception exception = new RuntimeException();
StateMachineRuntime<String, String> runtime = new StateMachineRuntime<String, String>() {
@Override
public StateContext<String, String> getStateContext() {
return new DefaultStateContext<String, String>(Stage.TRANSITION, message, messageHeaders, extendedState, transition, stateMachine, source,
target, exception);
}
};
handler.handle(runtime);
}
public static class Bean1 {
@OnTransition
public void onTransition(@EventHeaders Map<String, Object> headers, ExtendedState extendedState, StateMachine<?, ?> stateMachine,
Message<?> message, Exception e, StateContext<?, ?> stateContext) {
assertThat(headers, notNullValue());
assertThat(extendedState, notNullValue());
assertThat(stateMachine, notNullValue());
assertThat(message, notNullValue());
assertThat(e, notNullValue());
assertThat(stateContext, notNullValue());
}
}
}