/* * 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(MockClassInstantiationPerInvocationTest.MockClass1.class) public final class MockClassInstantiationPerInvocationTest { 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 = PerMockInvocation) static final class MockClass1 { static Object previousInstance; MockClass1() { assertNotSame(previousInstance, this); } @Mock void doSomething() { assertNotSame(previousInstance, this); previousInstance = this; } @Mock int performComputation(int a, boolean b) { assertNotSame(previousInstance, this); previousInstance = this; assertTrue(a > 0); assertTrue(b); return 2; } } @MockClass(realClass = RealClass2.class) static final class MockClass2 { static Object previousInstance; MockClass2() { assertNotSame(previousInstance, this); } @Mock void doSomething() { assertNotSame(previousInstance, this); previousInstance = this; } @Mock int performComputation(int a, boolean b) { assertNotSame(previousInstance, this); previousInstance = this; assertTrue(a > 0); assertTrue(b); return 2; } } @MockClass(realClass = RealClass3.class, instantiation = PerMockInvocation) static final class MockClass3 { static Object previousInstance; MockClass3() { assertNotSame(previousInstance, this); } @Mock void doSomething() { assertNotSame(previousInstance, this); previousInstance = this; } @Mock int performComputation(int a, boolean b) { assertNotSame(previousInstance, this); previousInstance = this; assertTrue(a > 0); assertTrue(b); return 2; } } @MockClass(realClass = RealClass4.class) static final class MockClass4 { static Object previousInstance; MockClass4() { assertNotSame(previousInstance, this); } @Mock void doSomething() { assertNotSame(previousInstance, this); previousInstance = this; } @Mock int performComputation(int a, boolean b) { assertNotSame(previousInstance, this); previousInstance = 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 mockInstancePerInvocationInClassAndFixtureScopes() { assertMockClass1(); assertMockClass2(); assertMockClass3(); assertEquals(1, new RealClass4().performComputation(1, true)); } private void assertMockClass1() { RealClass1.doSomething(); assertEquals(2, new RealClass1().performComputation(1, true)); } private void assertMockClass2() { RealClass2.doSomething(); assertEquals(2, new RealClass2().performComputation(1, true)); } private void assertMockClass3() { RealClass3.doSomething(); assertEquals(2, new RealClass3().performComputation(1, true)); } private void assertMockClass4() { RealClass4.doSomething(); assertEquals(2, new RealClass4().performComputation(1, true)); } @Test public void mockInstancePerInvocationInAllScopes() { setUpMocks(MockClass4.class); assertMockClass1(); assertMockClass2(); assertMockClass3(); assertMockClass4(); } }