/* * Copyright (c) 2006-2011 Rogério Liesenfeld * This file is subject to the terms of the MIT license (see LICENSE.txt). */ package mockit; import org.junit.*; import static mockit.Instantiation.*; import static mockit.Mockit.*; import static org.junit.Assert.*; @UsingMocksAndStubs(MockClassInstantiationPerMockedInstanceTest.MockClass1.class) public final class MockClassInstantiationPerMockedInstanceTest { static final class RealClass1 { static void doSomething() { throw new RuntimeException(); } int performComputation(int a, boolean b) { return b ? a : -a; } } static final class RealClass2 { static void doSomething() { throw new RuntimeException(); } int performComputation(int a, boolean b) { return b ? a : -a; } } static final class RealClass3 { static void doSomething() { throw new RuntimeException(); } int performComputation(int a, boolean b) { return b ? a : -a; } } static final class RealClass4 { static void doSomething() { throw new RuntimeException(); } int performComputation(int a, boolean b) { return b ? a : -a; } } @MockClass(realClass = RealClass1.class, instantiation = PerMockedInstance) static final class MockClass1 { static Object firstInstance; static Object secondInstance; MockClass1() { if (firstInstance == null) { firstInstance = this; } else { assertNull(secondInstance); secondInstance = this; } } @Mock void doSomething() { assertSame(firstInstance, this); assertNull(secondInstance); } @Mock int performComputation(int a, boolean b) { assertNotNull(firstInstance); assertNotSame(firstInstance, this); assertSame(secondInstance, this); assertTrue(a > 0); assertTrue(b); return 2; } } @MockClass(realClass = RealClass2.class, instantiation = PerMockedInstance) static final class MockClass2 { static Object firstInstance; static Object secondInstance; MockClass2() { if (firstInstance == null) { firstInstance = this; } else { assertNull(secondInstance); secondInstance = this; } } @Mock void doSomething() { assertSame(firstInstance, this); assertNull(secondInstance); } @Mock int performComputation(int a, boolean b) { assertNotNull(firstInstance); assertNotSame(firstInstance, this); assertSame(secondInstance, this); assertTrue(a > 0); assertTrue(b); return 2; } } @MockClass(realClass = RealClass3.class, instantiation = PerMockedInstance) static final class MockClass3 { static Object firstInstance; static Object secondInstance; MockClass3() { if (firstInstance == null) { firstInstance = this; } else { assertNull(secondInstance); secondInstance = this; } } @Mock void doSomething() { assertSame(firstInstance, this); assertNull(secondInstance); } @Mock int performComputation(int a, boolean b) { assertNotNull(firstInstance); assertNotSame(firstInstance, this); assertSame(secondInstance, this); assertTrue(a > 0); assertTrue(b); return 2; } } @MockClass(realClass = RealClass4.class, instantiation = PerMockedInstance) static final class MockClass4 { static Object firstInstance; static Object secondInstance; MockClass4() { if (firstInstance == null) { firstInstance = this; } else { assertNull(secondInstance); secondInstance = this; } } @Mock void doSomething() { assertSame(firstInstance, this); assertNull(secondInstance); } @Mock int performComputation(int a, boolean b) { assertNotNull(firstInstance); assertNotSame(firstInstance, this); assertSame(secondInstance, this); assertTrue(a > 0); assertTrue(b); return 2; } } @BeforeClass public static void setUpClassLevelMocks() { setUpMocksAndStubs(MockClass2.class); } @Before public void setUpMethodLevelMocks() { setUpMock(RealClass3.class, MockClass3.class); } @Test public void mockInstancePerMockedInstanceInClassAndFixtureScopes() { assertMockClass1(); assertMockClass2(); assertMockClass3(); assertEquals(1, new RealClass4().performComputation(1, true)); } private void assertMockClass1() { MockClass1.firstInstance = null; MockClass1.secondInstance = null; RealClass1.doSomething(); RealClass1 realClass = new RealClass1(); assertEquals(2, realClass.performComputation(1, true)); assertEquals(2, realClass.performComputation(3, true)); } private void assertMockClass2() { MockClass2.firstInstance = null; MockClass2.secondInstance = null; RealClass2.doSomething(); RealClass2 realClass = new RealClass2(); assertEquals(2, realClass.performComputation(1, true)); assertEquals(2, realClass.performComputation(3, true)); } private void assertMockClass3() { MockClass3.firstInstance = null; MockClass3.secondInstance = null; RealClass3.doSomething(); RealClass3 realClass = new RealClass3(); assertEquals(2, realClass.performComputation(1, true)); assertEquals(2, realClass.performComputation(3, true)); } private void assertMockClass4() { RealClass4.doSomething(); RealClass4 realClass = new RealClass4(); assertEquals(2, realClass.performComputation(1, true)); assertEquals(2, realClass.performComputation(3, true)); } @Test public void mockInstancePerMockedInstanceInAllScopes() { setUpMocks(MockClass4.class); assertMockClass1(); assertMockClass2(); assertMockClass3(); assertMockClass4(); } }