/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.core.transformer.builder; import static org.mockito.Matchers.argThat; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import org.mule.runtime.api.metadata.DataType; import org.mule.runtime.core.api.transformer.Transformer; import org.mule.runtime.core.api.transformer.TransformerException; import java.util.Arrays; import org.mockito.ArgumentMatcher; import org.mockito.Mockito; public abstract class AbstractMockTransformerBuilder<T extends AbstractMockTransformerBuilder> { protected String name; protected DataType resultDataType; protected DataType[] sourceDataTypes; protected Object value; public T named(String name) { this.name = name; return getThis(); } public T from(DataType... sourceDataTypes) { this.sourceDataTypes = sourceDataTypes; return getThis(); } public T to(DataType resultDataType) { this.resultDataType = resultDataType; return getThis(); } public T returning(Object value) { this.value = value; return getThis(); } public Transformer build() { Transformer transformer; if (name == null || name.isEmpty()) { transformer = mock(getClassToMock()); } else { transformer = mock(getClassToMock(), name); doReturn(name).when(transformer).getName(); } if (resultDataType != null) { doReturn(resultDataType).when(transformer).getReturnDataType(); } if (sourceDataTypes != null) { doReturn(Arrays.asList(sourceDataTypes)).when(transformer).getSourceDataTypes(); when(transformer.isSourceDataTypeSupported((DataType) argThat(new SupportsSourceDataType()))).thenReturn(true); } try { doReturn(value).when(transformer).transform(Mockito.any(Object.class)); } catch (TransformerException e) { // Not going to happen during mock setup } return transformer; } protected Class<? extends Transformer> getClassToMock() { return Transformer.class; } @SuppressWarnings({"unchecked"}) protected T getThis() { return (T) this; } class SupportsSourceDataType extends ArgumentMatcher { @Override public boolean matches(Object value) { DataType dataType = (DataType) value; for (DataType sourceDataType : sourceDataTypes) { if (sourceDataType.isCompatibleWith(dataType)) { return true; } } return false; } } }