/* * Copyright (c) 2006 Rogério Liesenfeld * This file is subject to the terms of the MIT license (see LICENSE.txt). */ package mockit; import java.io.*; import java.net.*; import java.util.*; import org.junit.*; import static org.junit.Assert.*; public final class MockClassInstantiationPerSetupTest { public static final class RealClass1 { public static void doSomething() { throw new RuntimeException(); } public int performComputation(int a, boolean b) { return b ? a : -a; } } public static final class RealClass2 { public static void doSomething() { throw new RuntimeException(); } public int performComputation(int a, boolean b) { return b ? a : -a; } } public static final class RealClass3 { public static void doSomething() { throw new RuntimeException(); } public int performComputation(int a, boolean b) { return b ? a : -a; } } public static final class RealClass4 { public static void doSomething() { throw new RuntimeException(); } public int performComputation(int a, boolean b) { return b ? a : -a; } } static final class MockClass1 extends MockUp<RealClass1> { static Object singleInstanceCreated; MockClass1() { assertNull(singleInstanceCreated); singleInstanceCreated = this; } @Mock void doSomething() { assertSame(singleInstanceCreated, this); } @Mock int performComputation(int a, boolean b) { assertSame(singleInstanceCreated, this); assertTrue(a > 0); assertTrue(b); return 2; } } static final class MockClass2 extends MockUp<RealClass2> { static Object singleInstanceCreated; MockClass2() { assertNull(singleInstanceCreated); singleInstanceCreated = this; } @Mock void doSomething() { assertSame(singleInstanceCreated, this); } @Mock int performComputation(int a, boolean b) { assertSame(singleInstanceCreated, this); assertTrue(a > 0); assertTrue(b); return 2; } } static final class MockClass3 extends MockUp<RealClass3> { static Object singleInstanceCreated; MockClass3() { assertNull(singleInstanceCreated); singleInstanceCreated = this; } @Mock void doSomething() { assertSame(singleInstanceCreated, this); } @Mock int performComputation(int a, boolean b) { assertSame(singleInstanceCreated, this); assertTrue(a > 0); assertTrue(b); return 2; } } static final class MockClass4 extends MockUp<RealClass4> { static Object singleInstanceCreated; MockClass4() { assertNull(singleInstanceCreated); singleInstanceCreated = this; } @Mock void doSomething() { assertSame(singleInstanceCreated, this); } @Mock int performComputation(int a, boolean b) { assertSame(singleInstanceCreated, this); assertTrue(a > 0); assertTrue(b); return 2; } } @BeforeClass public static void setUpClassLevelMocks() { new MockClass1(); } @BeforeClass public static void setUpAdditionalClassLevelMocks() { new MockClass2(); } @Before public void setUpMethodLevelMocks() { MockClass3.singleInstanceCreated = null; new MockClass3(); } @Test public void mockInstancePerSetupInClassAndFixtureScopes() { 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 mockInstancePerSetupInAllScopes() { new MockClass4(); assertMockClass1(); assertMockClass2(); assertMockClass3(); assertMockClass4(); } public static final class MockURL extends MockUp<URL> { @Mock public InputStream openStream(Invocation inv) throws IOException { URL it = inv.getInvokedInstance(); if ("test".equals(it.getHost())) { return new ByteArrayInputStream("response".getBytes()); } return it.openStream(); } } @Test public void reentrantMockForJREClass() throws Exception { new MockURL(); InputStream response = new URL("http://test").openStream(); assertEquals("response", new Scanner(response).nextLine()); } }