/* * Copyright 2017 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.integration.test.mock; import java.util.ArrayList; import java.util.List; import org.mockito.ArgumentCaptor; import org.mockito.BDDMockito; import org.mockito.Mockito; import org.springframework.integration.core.MessageSource; import org.springframework.messaging.Message; import org.springframework.messaging.support.GenericMessage; /** * The factory for integration specific mock components. * * @author Artem Bilan * * @since 5.0 */ public final class MockIntegration { /** * Build a mock for the {@link MessageSource} based on the provided payload. * The returned instance is ordinary Mockito mock that is capable of * recording interactions with it and further verification. * @param payload the payload to return by mocked {@link MessageSource} * @param <T> the payload type * @return the mocked {@link MessageSource} * @see Mockito#mock(Class) */ @SuppressWarnings("unchecked") public static <T> MessageSource<T> mockMessageSource(T payload) { return (MessageSource<T>) mockMessageSource(new GenericMessage<>(payload)); } /** * Build a mock for the {@link MessageSource} based on the provided payloads. * The returned instance is ordinary Mockito mock that is capable of * recording interactions with it and further verification. * @param payload the first payload to return by mocked {@link MessageSource} * @param payloads the next payloads to return by mocked {@link MessageSource} * @param <T> the payload type * @return the mocked {@link MessageSource} * @see Mockito#mock(Class) */ @SuppressWarnings("unchecked") public static <T> MessageSource<T> mockMessageSource(T payload, T... payloads) { List<Message<T>> messages = null; if (payloads != null) { messages = new ArrayList<>(payloads.length); for (T p : payloads) { messages.add(new GenericMessage<>(p)); } } return (MessageSource<T>) mockMessageSource(new GenericMessage<>(payload), (messages != null ? messages.toArray(new Message<?>[messages.size()]) : null)); } /** * Build a mock for the {@link MessageSource} based on the provided message. * The returned instance is ordinary Mockito mock that is capable of * recording interactions with it and further verification. * @param message the message to return by mocked {@link MessageSource} * @return the mocked {@link MessageSource} * @see Mockito#mock(Class) */ @SuppressWarnings("rawtypes") public static MessageSource<?> mockMessageSource(Message<?> message) { MessageSource messageSource = Mockito.mock(MessageSource.class); BDDMockito.given(messageSource.receive()) .willReturn(message); return messageSource; } /** * Build a mock for the {@link MessageSource} based on the provided messages. * The returned instance is ordinary Mockito mock that is capable of * recording interactions with it and further verification. * @param message the first message to return by mocked {@link MessageSource} * @param messages the next messages to return by mocked {@link MessageSource} * @return the mocked {@link MessageSource} * @see Mockito#mock(Class) */ @SuppressWarnings("rawtypes") public static MessageSource<?> mockMessageSource(Message<?> message, Message<?>... messages) { MessageSource messageSource = Mockito.mock(MessageSource.class); BDDMockito.given(messageSource.receive()) .willReturn(message, messages); return messageSource; } /** * Build a {@link MockMessageHandler} instance. * @return the {@link MockMessageHandler} instance ready for interaction */ public static MockMessageHandler mockMessageHandler() { return mockMessageHandler(null); } /** * Build a {@link MockMessageHandler} instance based on the provided {@link ArgumentCaptor}. * @param messageArgumentCaptor the Mockito ArgumentCaptor to capture incoming messages * @return the MockMessageHandler instance ready for interaction */ public static MockMessageHandler mockMessageHandler(ArgumentCaptor<Message<?>> messageArgumentCaptor) { return new MockMessageHandler(messageArgumentCaptor); } private MockIntegration() { } }