/* * 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.module.extension.internal.runtime; import static java.util.Optional.empty; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.CoreMatchers.sameInstance; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.when; import static org.mule.runtime.module.extension.internal.util.IntrospectionUtils.getField; import org.mule.runtime.core.api.Event; import org.mule.runtime.core.api.MuleContext; import org.mule.runtime.core.internal.message.InternalMessage; import org.mule.runtime.module.extension.internal.runtime.objectbuilder.DefaultObjectBuilder; import org.mule.runtime.module.extension.internal.runtime.resolver.ValueResolver; import org.mule.runtime.module.extension.internal.runtime.resolver.ValueResolvingContext; import org.mule.tck.junit4.AbstractMuleTestCase; import org.mule.tck.size.SmallTest; import org.mule.test.heisenberg.extension.model.PersonalInfo; import org.mule.test.module.extension.internal.util.ExtensionsTestUtils; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; @SmallTest @RunWith(MockitoJUnitRunner.class) public class DefaultObjectBuilderTestCase extends AbstractMuleTestCase { private static Class<?> PROTOTYPE_CLASS = PersonalInfo.class; private static final String NAME = "heisenberg"; private static final int AGE = 50; @Mock private Event event; @Mock private ValueResolvingContext resolvingContext; @Mock private MuleContext muleContext; private DefaultObjectBuilder<PersonalInfo> builder; private Field nameField; private Field ageField; private Field lifetimeInfoField; private List<ValueResolver> resolvers = new ArrayList<>(); @Before public void before() { builder = new DefaultObjectBuilder(PROTOTYPE_CLASS); nameField = getField(PROTOTYPE_CLASS, "name").get(); ageField = getField(PROTOTYPE_CLASS, "age").get(); when(resolvingContext.getEvent()).thenReturn(event); when(resolvingContext.getConfig()).thenReturn(empty()); } @Test public void build() throws Exception { populate(false); PersonalInfo personalInfo = builder.build(resolvingContext); verify(personalInfo); } @Test public void reusable() throws Exception { populate(false); PersonalInfo info1 = builder.build(resolvingContext); PersonalInfo info2 = builder.build(resolvingContext); PersonalInfo info3 = builder.build(resolvingContext); assertThat(info1, is(not(sameInstance(info2)))); assertThat(info1, is(not(sameInstance(info3)))); verify(info1); verify(info2); verify(info3); } private void verify(PersonalInfo personalInfo) { assertThat(personalInfo.getName(), is(NAME)); assertThat(personalInfo.getAge(), is(AGE)); } @Test public void isStatic() throws Exception { populate(false); assertThat(builder.isDynamic(), is(false)); } @Test public void isDynamic() throws Exception { builder.addPropertyResolver(nameField.getName(), getResolver(NAME, false)); builder.addPropertyResolver(ageField.getName(), getResolver(AGE, true)); assertThat(builder.isDynamic(), is(true)); } @Test(expected = IllegalArgumentException.class) public void buildInterface() throws Exception { builder = new DefaultObjectBuilder(InternalMessage.class); builder.build(resolvingContext); } @Test(expected = IllegalArgumentException.class) public void abstractClass() throws Exception { builder = new DefaultObjectBuilder(TestAbstract.class); builder.build(resolvingContext); } @Test(expected = IllegalArgumentException.class) public void noDefaultConstructor() throws Exception { builder = new DefaultObjectBuilder(TestNoDefaultConstructor.class); builder.build(resolvingContext); } @Test(expected = IllegalArgumentException.class) public void noPublicConstructor() throws Exception { builder = new DefaultObjectBuilder(NoPublicConstructor.class); builder.build(resolvingContext); } private void populate(boolean dynamic) throws Exception { builder.addPropertyResolver(nameField.getName(), getResolver(NAME, dynamic)); builder.addPropertyResolver(ageField.getName(), getResolver(AGE, dynamic)); } private ValueResolver getResolver(Object value, boolean dynamic) throws Exception { ValueResolver resolver = ExtensionsTestUtils.getResolver(value, resolvingContext, dynamic); resolvers.add(resolver); return resolver; } private static abstract class TestAbstract { } public static class TestNoDefaultConstructor { public TestNoDefaultConstructor(String value) {} } public static class NoPublicConstructor { protected NoPublicConstructor() {} } }