/* * Copyright (c) 2006-2011 Rogério Liesenfeld * This file is subject to the terms of the MIT license (see LICENSE.txt). */ package integrationTests; import static mockit.Mockit.*; import static org.junit.Assert.*; import org.junit.*; import mockit.*; public final class SubclassTest { private static boolean superClassConstructorCalled; private static boolean subClassConstructorCalled; private static boolean mockConstructorCalled; public static class SuperClass { final String name; public SuperClass(int x, String name) { this.name = name + x; superClassConstructorCalled = true; } } public static class SubClass extends SuperClass { public SubClass(String name) { super(name.length(), name); subClassConstructorCalled = true; } } @Before public void setUp() { superClassConstructorCalled = false; subClassConstructorCalled = false; mockConstructorCalled = false; } @Test public void captureSubclassThroughClassfileTransformer() { new NonStrictExpectations() { @Capturing SuperClass captured; }; new SubClass("capture"); assertFalse(superClassConstructorCalled); assertFalse(subClassConstructorCalled); } @Test public void captureSubclassThroughRedefinitionOfPreviouslyLoadedClasses() { new SubClass(""); assertTrue(superClassConstructorCalled); assertTrue(subClassConstructorCalled); superClassConstructorCalled = false; subClassConstructorCalled = false; new NonStrictExpectations() { @Capturing SuperClass captured; }; new SubClass("capture"); assertFalse(superClassConstructorCalled); assertFalse(subClassConstructorCalled); } @Test public void mockSubclassUsingMockUpClass() { new MockUp<SubClass>() { @Mock void $init(String name) { assertNotNull(name); mockConstructorCalled = true; } }; new SubClass("test"); assertTrue(superClassConstructorCalled); assertFalse(subClassConstructorCalled); assertTrue(mockConstructorCalled); } @Test public void mockSubclassUsingSetUpMocks() { setUpMocks(SubClassMockWithAnnotations.class); new SubClass("test"); assertTrue(superClassConstructorCalled); assertFalse(subClassConstructorCalled); assertTrue(mockConstructorCalled); } @MockClass(realClass = SubClass.class) public static final class SubClassMockWithAnnotations { @Mock(invocations = 1) public void $init(String name) { assertNotNull(name); mockConstructorCalled = true; } } @Test public void mockSubclassUsingExpectationsWithFirstSuperConstructor() { new Expectations() { final SubClass mock = null; { new SubClass("test"); } }; new SubClass("test"); assertFalse(superClassConstructorCalled); assertFalse(subClassConstructorCalled); } @Test public void partiallyMockSubclassFilteringInASingleConstructor() { new Expectations() { @Mocked("(String)") final SubClass mock = null; { new SubClass("test"); } }; new SubClass("test"); assertTrue(superClassConstructorCalled); assertFalse(subClassConstructorCalled); } }