package org.robolectric; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; import org.robolectric.annotation.internal.Instrument; import org.robolectric.internal.SandboxTestRunner; import org.robolectric.shadow.api.Shadow; import org.robolectric.internal.ShadowExtractor; import org.robolectric.internal.bytecode.SandboxConfig; import org.robolectric.util.ReflectionHelpers.ClassParameter; import static org.assertj.core.api.Assertions.assertThat; @SandboxConfig(shadows={ RobolectricInternalsTest.ShadowConstructors.class }) @RunWith(SandboxTestRunner.class) public class RobolectricInternalsTest { private static final String PARAM1 = "param1"; private static final Byte PARAM2 = (byte) 24; private static final Long PARAM3 = (long) 10122345; @Test public void getConstructor_withNoParams() { Constructors a = new Constructors(); ShadowConstructors sa = shadowOf(a); assertThat(a.constructorCalled).isFalse(); assertThat(sa.shadowConstructorCalled).isTrue(); Shadow.invokeConstructor(Constructors.class, a); assertThat(a.constructorCalled).isTrue(); } @Test public void getConstructor_withOneClassParam() { Constructors a = new Constructors(PARAM1); ShadowConstructors sa = shadowOf(a); assertThat(a.param11).isNull(); assertThat(sa.shadowParam11).isEqualTo(PARAM1); Shadow.invokeConstructor(Constructors.class, a, ClassParameter.from(String.class, PARAM1)); assertThat(a.param11).isEqualTo(PARAM1); } @Test public void getConstructor_withTwoClassParams() { Constructors a = new Constructors(PARAM1, PARAM2); ShadowConstructors sa = shadowOf(a); assertThat(a.param21).isNull(); assertThat(a.param22).isNull(); assertThat(sa.shadowParam21).isEqualTo(PARAM1); assertThat(sa.shadowParam22).isEqualTo(PARAM2); Shadow.invokeConstructor(Constructors.class, a, ClassParameter.from(String.class, PARAM1), ClassParameter.from(Byte.class, PARAM2)); assertThat(a.param21).isEqualTo(PARAM1); assertThat(a.param22).isEqualTo(PARAM2); } @Test public void getConstructor_withThreeClassParams() { Constructors a = new Constructors(PARAM1, PARAM2, PARAM3); ShadowConstructors sa = shadowOf(a); assertThat(a.param31).isNull(); assertThat(a.param32).isNull(); assertThat(a.param33).isNull(); assertThat(sa.shadowParam31).isEqualTo(PARAM1); assertThat(sa.shadowParam32).isEqualTo(PARAM2); assertThat(sa.shadowParam33).isEqualTo(PARAM3); Shadow.invokeConstructor(Constructors.class, a, ClassParameter.from(String.class, PARAM1), ClassParameter.from(Byte.class, PARAM2), ClassParameter.from(Long.class, PARAM3)); assertThat(a.param31).isEqualTo(PARAM1); assertThat(a.param32).isEqualTo(PARAM2); assertThat(a.param33).isEqualTo(PARAM3); } private static ShadowConstructors shadowOf(Constructors realObject) { Object shadow = ShadowExtractor.extract(realObject); assertThat(shadow).isNotNull().isInstanceOf(ShadowConstructors.class); return (ShadowConstructors) shadow; } @Instrument public static class Constructors { public boolean constructorCalled = false; public String param11 = null; public String param21 = null; public Byte param22 = null; public String param31 = null; public Byte param32 = null; public Long param33 = null; public Constructors() { constructorCalled = true; } public Constructors(String param) { param11 = param; } public Constructors(String param1, Byte param2) { param21 = param1; param22 = param2; } public Constructors(String param1, Byte param2, Long param3) { param31 = param1; param32 = param2; param33 = param3; } } @Implements(Constructors.class) public static class ShadowConstructors { public boolean shadowConstructorCalled = false; public String shadowParam11 = null; public String shadowParam21 = null; public Byte shadowParam22 = null; public String shadowParam31 = null; public Byte shadowParam32 = null; public Long shadowParam33 = null; @Implementation public void __constructor__() { shadowConstructorCalled = true; } @Implementation public void __constructor__(String param) { shadowParam11 = param; } @Implementation public void __constructor__(String param1, Byte param2) { shadowParam21 = param1; shadowParam22 = param2; } @Implementation public void __constructor__(String param1, Byte param2, Long param3) { shadowParam31 = param1; shadowParam32 = param2; shadowParam33 = param3; } } }