/* * 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.exception; import static org.mule.test.allure.AllureConstants.ErrorHandlingFeature.ERROR_HANDLING; import static org.mule.test.allure.AllureConstants.ErrorHandlingFeature.ErrorHandlingStory.EXCEPTION_MAPPINGS; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; import org.mule.runtime.api.message.ErrorType; import org.mule.runtime.api.exception.MuleRuntimeException; import org.mule.tck.junit4.AbstractMuleTestCase; import org.junit.Test; import ru.yandex.qatools.allure.annotations.Features; import ru.yandex.qatools.allure.annotations.Stories; @Features(ERROR_HANDLING) @Stories(EXCEPTION_MAPPINGS) public class ExceptionMapperTestCase extends AbstractMuleTestCase { private ErrorType runtimeExceptionErrorType = mock(ErrorType.class); private ErrorType illegalArgumentExceptionErrorType = mock(ErrorType.class); private ErrorType numberFormatExceptionErrorType = mock(ErrorType.class); private ErrorType classCastExceptionErrorType = mock(ErrorType.class); private ErrorType arrayStoreExceptionErrorType = mock(ErrorType.class); private ErrorType arrayStoreChildExceptionErrorType = mock(ErrorType.class); @Test public void sameHierarchyMapping() { ExceptionMapper exceptionMapper = ExceptionMapper.builder() .addExceptionMapping(RuntimeException.class, runtimeExceptionErrorType) .addExceptionMapping(NumberFormatException.class, numberFormatExceptionErrorType) .addExceptionMapping(IllegalArgumentException.class, illegalArgumentExceptionErrorType).build(); assertThat(exceptionMapper.resolveErrorType(IllegalArgumentException.class).get(), is(illegalArgumentExceptionErrorType)); assertThat(exceptionMapper.resolveErrorType(NumberFormatException.class).get(), is(numberFormatExceptionErrorType)); assertThat(exceptionMapper.resolveErrorType(RuntimeException.class).get(), is(runtimeExceptionErrorType)); assertThat(exceptionMapper.resolveErrorType(Exception.class).isPresent(), is(false)); } @Test public void differentHierarchyMapping() { ExceptionMapper exceptionMapper = ExceptionMapper.builder() .addExceptionMapping(NumberFormatException.class, numberFormatExceptionErrorType) .addExceptionMapping(ClassCastException.class, classCastExceptionErrorType) .addExceptionMapping(ArrayStoreException.class, arrayStoreExceptionErrorType).build(); assertThat(exceptionMapper.resolveErrorType(NumberFormatException.class).get(), is(numberFormatExceptionErrorType)); assertThat(exceptionMapper.resolveErrorType(ArrayStoreException.class).get(), is(arrayStoreExceptionErrorType)); assertThat(exceptionMapper.resolveErrorType(ClassCastException.class).get(), is(classCastExceptionErrorType)); assertThat(exceptionMapper.resolveErrorType(Exception.class).isPresent(), is(false)); } /** * Creates a complex hierarchy starting with {@link RuntimeException} and several children, but with gaps in between and adding * them out of order. Verifies that the error types respect the hierarchy even for those classes in the gap. */ @Test public void complexHierarchyMapping() { ExceptionMapper exceptionMapper = ExceptionMapper.builder() .addExceptionMapping(NumberFormatException.class, numberFormatExceptionErrorType) .addExceptionMapping(ClassCastException.class, classCastExceptionErrorType) .addExceptionMapping(RuntimeException.class, runtimeExceptionErrorType) .addExceptionMapping(ArrayStoreChildException.class, arrayStoreChildExceptionErrorType) .addExceptionMapping(ArrayStoreException.class, arrayStoreExceptionErrorType) .build(); assertThat(exceptionMapper.resolveErrorType(RuntimeException.class).get(), is(runtimeExceptionErrorType)); assertThat(exceptionMapper.resolveErrorType(IllegalArgumentException.class).get(), is(runtimeExceptionErrorType)); assertThat(exceptionMapper.resolveErrorType(NumberFormatException.class).get(), is(numberFormatExceptionErrorType)); assertThat(exceptionMapper.resolveErrorType(ArrayStoreException.class).get(), is(arrayStoreExceptionErrorType)); assertThat(exceptionMapper.resolveErrorType(ArrayStoreChildException.class).get(), is(arrayStoreChildExceptionErrorType)); assertThat(exceptionMapper.resolveErrorType(ClassCastException.class).get(), is(classCastExceptionErrorType)); assertThat(exceptionMapper.resolveErrorType(ClassCastChildException.class).get(), is(classCastExceptionErrorType)); assertThat(exceptionMapper.resolveErrorType(Exception.class).isPresent(), is(false)); } @Test(expected = MuleRuntimeException.class) public void sameExceptionWithDifferentErrorTypes() { ExceptionMapper.builder() .addExceptionMapping(NumberFormatException.class, numberFormatExceptionErrorType) .addExceptionMapping(NumberFormatException.class, illegalArgumentExceptionErrorType); } private static class ClassCastChildException extends ClassCastException { } private static class ArrayStoreChildException extends ArrayStoreException { } }